diff --git a/pom.xml b/pom.xml index a6791e8..8f3fe0b 100644 --- a/pom.xml +++ b/pom.xml @@ -518,4 +518,4 @@ - \ No newline at end of file + diff --git a/spring-ai-alibaba-core/pom.xml b/spring-ai-alibaba-core/pom.xml index b277bcc..0065f2b 100644 --- a/spring-ai-alibaba-core/pom.xml +++ b/spring-ai-alibaba-core/pom.xml @@ -53,7 +53,6 @@ - org.springframework.ai spring-ai-test @@ -73,4 +72,4 @@ - \ No newline at end of file + diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java index dcc95bf..b0af59a 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java @@ -65,6 +65,7 @@ /** * @author nuocheng.lxm + * @author yuluo * @date 2024/8/16 11:45 */ @AutoConfiguration(after = { RestClientAutoConfiguration.class, WebClientAutoConfiguration.class, @@ -227,33 +228,4 @@ private record ResolvedConnectionProperties(String baseUrl, String apiKey, Strin CollectionUtils.toMultiValueMap(connectionHeaders)); } - /** - * Setting the API key. - * @param connectionProperties {@link DashScopeConnectionProperties} - */ - private void settingApiKey(DashScopeConnectionProperties connectionProperties) { - String apiKey; - try { - // It is recommended to set the key by defining the api-key in an environment - // variable. - var envKey = System.getenv(DASHSCOPE_API_KEY); - if (Objects.nonNull(envKey)) { - Constants.apiKey = envKey; - return; - } - if (Objects.nonNull(connectionProperties.getApiKey())) { - apiKey = connectionProperties.getApiKey(); - } - else { - apiKey = ApiKey.getApiKey(null); - } - - Constants.apiKey = apiKey; - } - catch (NoApiKeyException e) { - throw new RuntimeException(e.getMessage()); - } - - } - } diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeChatProperties.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeChatProperties.java index 7138eb9..8f10aff 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeChatProperties.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeChatProperties.java @@ -33,12 +33,12 @@ public class DashScopeChatProperties extends DashScopeParentProperties { /** - * Spring Cloud Alibaba AI configuration prefix. + * Spring AI Alibaba configuration prefix. */ public static final String CONFIG_PREFIX = "spring.ai.dashscope.chat"; /** - * Default DashScope Qwen Chat model. + * Default DashScope Chat model. */ public static final String DEFAULT_DEPLOYMENT_NAME = Generation.Models.QWEN_TURBO; @@ -48,7 +48,7 @@ public class DashScopeChatProperties extends DashScopeParentProperties { private static final Float DEFAULT_TEMPERATURE = 0.8f; /** - * Enable qwen ai chat client. + * Enable Dashscope ai chat client. */ private boolean enabled = true; diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeConnectionProperties.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeConnectionProperties.java index 7f4c763..68969d2 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeConnectionProperties.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeConnectionProperties.java @@ -22,7 +22,7 @@ import static com.alibaba.cloud.ai.dashscope.common.DashScopeApiConstants.DEFAULT_READ_TIMEOUT; /** - * Spring Cloud Alibaba AI TongYi LLM connection properties. + * Spring AI Alibaba TongYi LLM connection properties. * * @author yuluo * @author yuluo diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeImageProperties.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeImageProperties.java index d85a1f6..06697a6 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeImageProperties.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeImageProperties.java @@ -34,17 +34,17 @@ public class DashScopeImageProperties extends DashScopeParentProperties { /** - * Spring Cloud Alibaba AI configuration prefix. + * Spring AI Alibaba configuration prefix. */ public static final String CONFIG_PREFIX = "spring.ai.dashscope.image"; /** - * Default TongYi Chat model. + * Default DashScope Chat model. */ public static final String DEFAULT_IMAGES_MODEL_NAME = ImageSynthesis.Models.WANX_V1; /** - * Enable TongYiQWEN ai images client. + * Enable DashScope ai images client. */ private boolean enabled = true; diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeParentProperties.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeParentProperties.java index 416c37b..af21e53 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeParentProperties.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeParentProperties.java @@ -49,11 +49,11 @@ public void setBaseUrl(String baseUrl) { this.baseUrl = baseUrl; } - String getWorkspaceId() { + public String getWorkspaceId() { return workspaceId; } - void setWorkspaceId(String workspaceId) { + public void setWorkspaceId(String workspaceId) { this.workspaceId = workspaceId; } diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/api/DashScopeApi.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/api/DashScopeApi.java index 41d59ce..684a522 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/api/DashScopeApi.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/api/DashScopeApi.java @@ -38,6 +38,7 @@ /** * @author nuocheng.lxm + * @author yuluo * @date 2024/7/31 14:15 */ public class DashScopeApi { @@ -345,12 +346,6 @@ public record DocumentChunk(@JsonProperty("chunk_id") int chunkId, @JsonProperty } } - /** - * 上传文件 返回文件ID - * @param file - * @param request - * @return - */ public String upload(File file, UploadRequest request) { // 申请上传 ResponseEntity responseEntity = uploadLease(request); @@ -358,15 +353,12 @@ public String upload(File file, UploadRequest request) { if (uploadLeaseResponse == null) { throw new DashScopeException(ErrorCodeEnum.READER_APPLY_LEASE_ERROR); } - if (!"SUCCESS".equals(uploadLeaseResponse.code().toUpperCase())) { + if (!"SUCCESS".equalsIgnoreCase(uploadLeaseResponse.code())) { throw new DashScopeException("ApplyLease Failed,code:%s,message:%s".formatted(uploadLeaseResponse.code(), uploadLeaseResponse.message())); } - // 上传文件 uploadFile(file, uploadLeaseResponse); - // 开始解析 - String fileId = addFile(uploadLeaseResponse.data.leaseId(), request); - return fileId; + return addFile(uploadLeaseResponse.data.leaseId(), request); } public ResponseEntity> queryFileInfo(String categoryId, @@ -451,8 +443,7 @@ public String getFilename() { } }; HttpEntity requestEntity = new HttpEntity<>(resource, headers); - ResponseEntity response = restTemplate.exchange(new URI(uploadParam.url), HttpMethod.PUT, - requestEntity, Void.class); + restTemplate.exchange(new URI(uploadParam.url), HttpMethod.PUT, requestEntity, Void.class); } catch (Exception ex) { throw new DashScopeException("Upload File Failed", ex); @@ -672,8 +663,8 @@ public void upsertPipeline(List documents, DashScopeStoreOptions store retrieverOptions.getRerankModelName())), retrieverOptions.getRerankMinScore(), retrieverOptions.getRerankTopN())); List documentIdList = documents.stream() - .filter(e -> e.getId() != null) .map(Document::getId) + .filter(Objects::nonNull) .collect(Collectors.toList()); UpsertPipelineRequest upsertPipelineRequest = new UpsertPipelineRequest(storeOptions.getIndexName(), "MANAGED_SHARED", null, "unstructured", "recommend", @@ -689,7 +680,7 @@ public void upsertPipeline(List documents, DashScopeStoreOptions store .retrieve() .toEntity(UpsertPipelineResponse.class); if (upsertPipelineResponse.getBody() == null - || !"SUCCESS".equals(upsertPipelineResponse.getBody().status.toUpperCase())) { + || !"SUCCESS".equalsIgnoreCase(upsertPipelineResponse.getBody().status)) { throw new DashScopeException(ErrorCodeEnum.CREATE_INDEX_ERROR); } String pipelineId = upsertPipelineResponse.getBody().id; @@ -698,8 +689,7 @@ public void upsertPipeline(List documents, DashScopeStoreOptions store .body(upsertPipelineRequest) .retrieve() .toEntity(StartPipelineResponse.class); - if (startPipelineResponse.getBody() == null - || !"SUCCESS".equals(startPipelineResponse.getBody().code.toUpperCase()) + if (startPipelineResponse.getBody() == null || !"SUCCESS".equalsIgnoreCase(startPipelineResponse.getBody().code) || startPipelineResponse.getBody().ingestionId == null) { throw new DashScopeException(ErrorCodeEnum.INDEX_ADD_DOCUMENT_ERROR); } @@ -715,7 +705,7 @@ public boolean deletePipelineDocument(String pipelineId, List idList) { .retrieve() .toEntity(DelePipelineDocumentResponse.class); if (deleDocumentResponse == null || deleDocumentResponse.getBody() == null - || !"SUCCESS".equals(deleDocumentResponse.getBody().code.toUpperCase())) { + || !"SUCCESS".equalsIgnoreCase(deleDocumentResponse.getBody().code)) { return false; } return true; @@ -736,11 +726,11 @@ public List retriever(String pipelineId, String query, DashScopeDocume .retrieve() .toEntity(DocumentRetrieveResponse.class); if (deleDocumentResponse == null || deleDocumentResponse.getBody() == null - || !"SUCCESS".equals(deleDocumentResponse.getBody().code.toUpperCase())) { + || !"SUCCESS".equalsIgnoreCase(deleDocumentResponse.getBody().code)) { throw new DashScopeException(ErrorCodeEnum.RETRIEVER_DOCUMENT_ERROR); } List nodeList = deleDocumentResponse.getBody().nodes; - if (nodeList == null || nodeList.size() == 0) { + if (nodeList == null || nodeList.isEmpty()) { return new ArrayList<>(); } List documents = new ArrayList<>(); diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/api/DashScopeAudioApi.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/api/DashScopeAudioApi.java index 5bf4384..983b619 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/api/DashScopeAudioApi.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/api/DashScopeAudioApi.java @@ -180,7 +180,7 @@ public record SpeechRequest( */ public enum Voice { - // @formatter:off + // @formatter:off @JsonProperty("alloy") ALLOY("alloy"), @JsonProperty("echo") ECHO("echo"), @JsonProperty("fable") FABLE("fable"), @@ -191,7 +191,7 @@ public enum Voice { public final String value; - private Voice(String value) { + Voice(String value) { this.value = value; } @@ -566,7 +566,7 @@ public record StructuredResponse( // @formatter:on /** - * Extracted word and it corresponding timestamps. + * Extracted word and it's corresponding timestamps. * * @param word The text content of the word. * @param start The start time of the word in seconds. diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/DashScopeAudioSpeechModelOpenAPI.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/DashScopeAudioSpeechModelOpenAPI.java index 4d30bc5..96fe27d 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/DashScopeAudioSpeechModelOpenAPI.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/DashScopeAudioSpeechModelOpenAPI.java @@ -16,8 +16,6 @@ package com.alibaba.cloud.ai.dashscope.audio; -import java.nio.ByteBuffer; - import com.alibaba.cloud.ai.dashscope.api.DashScopeAudioApi; import com.alibaba.cloud.ai.dashscope.audio.speech.Speech; import com.alibaba.cloud.ai.dashscope.audio.speech.SpeechModel; @@ -29,7 +27,6 @@ import com.alibaba.cloud.ai.dashscope.metadata.audio.DashScopeAudioSpeechResponseMetadata; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.ai.chat.metadata.RateLimit; import org.springframework.ai.retry.RetryUtils; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; @@ -38,8 +35,6 @@ import reactor.core.publisher.Flux; -import static org.springframework.util.ObjectUtils.isEmpty; - /** * OpenAI audio speech client implementation for backed by {@link DashScopeAudioApi}. * diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/DashScopeAudioTranscriptionModelOpenAPI.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/DashScopeAudioTranscriptionModelOpenAPI.java index 92aadcd..9c89187 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/DashScopeAudioTranscriptionModelOpenAPI.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/DashScopeAudioTranscriptionModelOpenAPI.java @@ -17,18 +17,14 @@ package com.alibaba.cloud.ai.dashscope.audio; import com.alibaba.cloud.ai.dashscope.api.DashScopeAudioApi; -import com.alibaba.cloud.ai.dashscope.metadata.audio.DashScopeAudioTranscriptionResponseMetadata; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.ai.audio.transcription.AudioTranscription; import org.springframework.ai.audio.transcription.AudioTranscriptionPrompt; import org.springframework.ai.audio.transcription.AudioTranscriptionResponse; -import org.springframework.ai.chat.metadata.RateLimit; import org.springframework.ai.model.Model; import org.springframework.ai.retry.RetryUtils; import org.springframework.core.io.Resource; -import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/DashScopeAudioTranscriptionOptions.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/DashScopeAudioTranscriptionOptions.java index f2877ce..4c2c7d7 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/DashScopeAudioTranscriptionOptions.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/DashScopeAudioTranscriptionOptions.java @@ -24,7 +24,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.springframework.ai.audio.transcription.AudioTranscriptionOptions; -import org.springframework.ai.model.ModelOptions; import org.springframework.boot.context.properties.NestedConfigurationProperty; /** diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/Speech.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/Speech.java index 9a8c53f..9477171 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/Speech.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/Speech.java @@ -16,7 +16,6 @@ package com.alibaba.cloud.ai.dashscope.audio.speech; -import java.nio.ByteBuffer; import java.util.Arrays; import java.util.Objects; diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/SpeechModel.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/SpeechModel.java index dac959b..dceb81c 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/SpeechModel.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/SpeechModel.java @@ -16,8 +16,6 @@ package com.alibaba.cloud.ai.dashscope.audio.speech; -import java.nio.ByteBuffer; - import org.springframework.ai.model.Model; /** diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/SpeechStreamModel.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/SpeechStreamModel.java index 11c814a..2fa085a 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/SpeechStreamModel.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/SpeechStreamModel.java @@ -16,8 +16,6 @@ package com.alibaba.cloud.ai.dashscope.audio.speech; -import java.nio.ByteBuffer; - import reactor.core.publisher.Flux; import org.springframework.ai.model.StreamingModel; diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/StreamingSpeechModel.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/StreamingSpeechModel.java index e170ef7..0bd8ac2 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/StreamingSpeechModel.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/audio/speech/StreamingSpeechModel.java @@ -16,8 +16,6 @@ package com.alibaba.cloud.ai.dashscope.audio.speech; -import java.nio.ByteBuffer; - import reactor.core.publisher.Flux; import org.springframework.ai.model.StreamingModel; diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/chat/DashScopeChatModel.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/chat/DashScopeChatModel.java index 1992f80..0a5ccc8 100755 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/chat/DashScopeChatModel.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/chat/DashScopeChatModel.java @@ -41,6 +41,15 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.MimeType; +/** + * {@link ChatModel} implementation for {@literal Alibaba DashScope} backed by + * {@link Generation}. + * + * @author yuluo + * @author yuluo + * @see ChatModel + * @see com.alibaba.dashscope.aigc.generation + */ public class DashScopeChatModel extends AbstractToolCallSupport implements ChatModel { private static final Logger logger = LoggerFactory.getLogger(DashScopeChatModel.class); diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/chat/DashScopeChatOptions.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/chat/DashScopeChatOptions.java index 0b2b964..3cdb1ed 100755 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/chat/DashScopeChatOptions.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/chat/DashScopeChatOptions.java @@ -51,8 +51,6 @@ public class DashScopeChatOptions implements FunctionCallingOptions, ChatOptions private @JsonProperty("top_k") Integer topK; /** - * - * *
    *
  • stop参数用于实现内容生成过程的精确控制,在生成内容即将包含指定的字符串或token_ids时自动停止,生成内容不包含指定的内容。 *

    例如,如果指定stop为"你好",表示将要生成"你好"时停止;如果指定stop为[37763, 367],表示将要生成"Observation"时停止。 diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/embedding/DashScopeEmbeddingModel.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/embedding/DashScopeEmbeddingModel.java index f8096fa..e20163a 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/embedding/DashScopeEmbeddingModel.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/embedding/DashScopeEmbeddingModel.java @@ -42,6 +42,9 @@ * DashScope Embedding Model implementation. * * @author nuocheng.lxm + * @author why_ohh + * @author yuluo + * @author why_ohh * @date 2024/7/31 10:57 */ public class DashScopeEmbeddingModel extends AbstractEmbeddingModel { diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/embedding/DashScopeEmbeddingOptions.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/embedding/DashScopeEmbeddingOptions.java index 45876ce..6c50e40 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/embedding/DashScopeEmbeddingOptions.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/embedding/DashScopeEmbeddingOptions.java @@ -23,6 +23,9 @@ /** * @author nuocheng.lxm + * @author why_ohh + * @author yuluo + * @author why_ohh * @date 2024/8/1 11:14 */ @JsonInclude(JsonInclude.Include.NON_NULL) diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/image/DashScopeImageModel.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/image/DashScopeImageModel.java index 61078b2..05ea956 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/image/DashScopeImageModel.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/image/DashScopeImageModel.java @@ -14,11 +14,12 @@ /** * @author nuocheng.lxm + * @author yuluo * @date 2024/8/16 11:29 */ public class DashScopeImageModel implements ImageModel { - private static Logger logger = LoggerFactory.getLogger(DashScopeImageModel.class); + private static final Logger logger = LoggerFactory.getLogger(DashScopeImageModel.class); /** * Low-level access to the DashScope Image API. @@ -126,7 +127,7 @@ private ImageResponse toImageResponse( DashScopeImageApi.DashScopeImageAsyncReponse.DashScopeImageAsyncReponseOutput output) { List genImageList = output .results(); - if (genImageList == null || genImageList.size() == 0) { + if (genImageList == null || genImageList.isEmpty()) { return new ImageResponse(List.of()); } List imageGenerationList = genImageList.stream() diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/image/DashScopeImageOptions.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/image/DashScopeImageOptions.java index 116f0d0..562e231 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/image/DashScopeImageOptions.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/image/DashScopeImageOptions.java @@ -23,6 +23,7 @@ /** * @author nuocheng.lxm + * @author yuluo * @date 2024/8/16 11:29 */ @JsonInclude(JsonInclude.Include.NON_NULL) diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/metadata/DashScopeAiUsage.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/metadata/DashScopeAiUsage.java index 80cf643..4d1f267 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/metadata/DashScopeAiUsage.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/metadata/DashScopeAiUsage.java @@ -15,7 +15,6 @@ */ package com.alibaba.cloud.ai.dashscope.metadata; -import com.alibaba.cloud.ai.dashscope.api.DashScopeApi; import com.alibaba.cloud.ai.dashscope.api.DashScopeApi.TokenUsage; import org.springframework.ai.chat.metadata.Usage; import org.springframework.util.Assert; diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/metadata/audio/DashScopeAudioSpeechResponseMetadata.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/metadata/audio/DashScopeAudioSpeechResponseMetadata.java index 6afa4dc..719e84d 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/metadata/audio/DashScopeAudioSpeechResponseMetadata.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/metadata/audio/DashScopeAudioSpeechResponseMetadata.java @@ -16,8 +16,6 @@ package com.alibaba.cloud.ai.dashscope.metadata.audio; -import java.util.HashMap; - import com.alibaba.dashscope.audio.tts.SpeechSynthesisResult; import com.alibaba.dashscope.audio.tts.SpeechSynthesisUsage; import com.alibaba.dashscope.audio.tts.timestamp.Sentence; @@ -25,7 +23,6 @@ import org.springframework.ai.chat.metadata.EmptyRateLimit; import org.springframework.ai.chat.metadata.RateLimit; import org.springframework.ai.model.MutableResponseMetadata; -import org.springframework.ai.model.ResponseMetadata; import org.springframework.lang.Nullable; import org.springframework.util.Assert; diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/metadata/audio/DashScopeAudioTranscriptionResponseMetadata.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/metadata/audio/DashScopeAudioTranscriptionResponseMetadata.java index d1d9e61..7cdf401 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/metadata/audio/DashScopeAudioTranscriptionResponseMetadata.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/metadata/audio/DashScopeAudioTranscriptionResponseMetadata.java @@ -16,15 +16,12 @@ package com.alibaba.cloud.ai.dashscope.metadata.audio; -import java.util.HashMap; - 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.MutableResponseMetadata; -import org.springframework.ai.model.ResponseMetadata; import org.springframework.lang.Nullable; import org.springframework.util.Assert; diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/rag/DashScopeCloudStore.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/rag/DashScopeCloudStore.java index 3a6952a..7aeecfa 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/rag/DashScopeCloudStore.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/rag/DashScopeCloudStore.java @@ -37,8 +37,6 @@ */ public class DashScopeCloudStore implements VectorStore { - private static final Logger logger = LoggerFactory.getLogger(DashScopeCloudStore.class); - private final DashScopeStoreOptions options; private final DashScopeApi dashScopeApi; @@ -64,7 +62,7 @@ public void add(List documents) { .filter(e -> e.getId() != null) .map(Document::getId) .collect(Collectors.toList()); - if (documentIdList == null || documentIdList.size() == 0) { + if (documentIdList == null || documentIdList.isEmpty()) { throw new DashScopeException("document's id must not be null"); } dashScopeApi.upsertPipeline(documents, options); @@ -97,8 +95,7 @@ public List similaritySearch(SearchRequest request) { searchOption = new DashScopeDocumentRetrieverOptions(); } searchOption.setRerankTopN(request.getTopK()); - List documentList = dashScopeApi.retriever(pipelineId, request.query, searchOption); - return documentList; + return dashScopeApi.retriever(pipelineId, request.query, searchOption); } } diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/rag/DashScopeDocumentCloudReader.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/rag/DashScopeDocumentCloudReader.java index 5a8e037..6d81d31 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/rag/DashScopeDocumentCloudReader.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/rag/DashScopeDocumentCloudReader.java @@ -65,7 +65,7 @@ public DashScopeDocumentCloudReader(String filePath, DashScopeApi dashScopeApi, @Override public List get() { - String fileMD5 = null; + String fileMD5; FileInputStream fileInputStream; try { fileInputStream = new FileInputStream(file); @@ -73,9 +73,9 @@ public List get() { DashScopeApi.UploadRequest uploadRequest = new DashScopeApi.UploadRequest(readerConfig.getCategoryId(), file.getName(), file.length(), fileMD5); String fileId = dashScopeApi.upload(file, uploadRequest); - // 轮询获取结果 + // Polling for results int tryCount = 0; - while (true && tryCount < MAX_TRY_COUNT) { + while (tryCount < MAX_TRY_COUNT) { ResponseEntity> response = dashScopeApi .queryFileInfo(readerConfig.getCategoryId(), new DashScopeApi.UploadRequest.QueryFileRequest(fileId)); @@ -83,7 +83,7 @@ public List get() { DashScopeApi.QueryFileResponseData queryFileResponseData = response.getBody().data(); String fileStatus = queryFileResponseData.status(); if ("PARSE_SUCCESS".equals(fileStatus)) { - // 下载文件 + // downloadn files String parseResult = dashScopeApi.getFileParseResult(readerConfig.getCategoryId(), new DashScopeApi.UploadRequest.QueryFileRequest(fileId)); return List.of(toDocument(fileId, parseResult)); @@ -95,7 +95,7 @@ else if ("PARSE_FAILED".equals(fileStatus)) { } } tryCount++; - Thread.sleep(30000l); + Thread.sleep(30000L); } return null; } @@ -108,8 +108,7 @@ else if ("PARSE_FAILED".equals(fileStatus)) { private Document toDocument(String fileId, String parseResultText) { Map metaData = new HashMap<>(); metaData.put("parse_fmt_type", "DASHSCOPE_DOCMIND"); - Document document = new Document(fileId, parseResultText, metaData); - return document; + return new Document(fileId, parseResultText, metaData); } } diff --git a/spring-ai-alibaba-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/spring-ai-alibaba-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 5a5a96d..1a89e69 100755 --- a/spring-ai-alibaba-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/spring-ai-alibaba-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeAutoConfiguration \ No newline at end of file +com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeAutoConfiguration diff --git a/spring-ai-alibaba-examples/chatmodel-example/src/main/java/com/alibaba/cloud/ai/example/model/AudioModelController.java b/spring-ai-alibaba-examples/chatmodel-example/src/main/java/com/alibaba/cloud/ai/example/model/AudioModelController.java index a8d77d9..7085cab 100644 --- a/spring-ai-alibaba-examples/chatmodel-example/src/main/java/com/alibaba/cloud/ai/example/model/AudioModelController.java +++ b/spring-ai-alibaba-examples/chatmodel-example/src/main/java/com/alibaba/cloud/ai/example/model/AudioModelController.java @@ -17,4 +17,5 @@ package com.alibaba.cloud.ai.example.model; public class AudioModelController { + } diff --git a/spring-ai-alibaba-examples/chatmodel-example/src/main/java/com/alibaba/cloud/ai/example/model/ChatModelController.java b/spring-ai-alibaba-examples/chatmodel-example/src/main/java/com/alibaba/cloud/ai/example/model/ChatModelController.java index 8d15e3b..2bd16e3 100644 --- a/spring-ai-alibaba-examples/chatmodel-example/src/main/java/com/alibaba/cloud/ai/example/model/ChatModelController.java +++ b/spring-ai-alibaba-examples/chatmodel-example/src/main/java/com/alibaba/cloud/ai/example/model/ChatModelController.java @@ -37,4 +37,5 @@ public String chat(String input) { ChatResponse response = chatModel.call(new Prompt(input)); return response.getResult().getOutput().getContent(); } + } diff --git a/spring-ai-alibaba-examples/chatmodel-example/src/main/java/com/alibaba/cloud/ai/example/model/ImageModelController.java b/spring-ai-alibaba-examples/chatmodel-example/src/main/java/com/alibaba/cloud/ai/example/model/ImageModelController.java index b07e254..0cd6190 100644 --- a/spring-ai-alibaba-examples/chatmodel-example/src/main/java/com/alibaba/cloud/ai/example/model/ImageModelController.java +++ b/spring-ai-alibaba-examples/chatmodel-example/src/main/java/com/alibaba/cloud/ai/example/model/ImageModelController.java @@ -26,6 +26,7 @@ @RestController public class ImageModelController { + private final ImageModel imageModel; ImageModelController(ImageModel imageModel) { @@ -34,9 +35,7 @@ public class ImageModelController { @RequestMapping("/image") public String image(String input) { - ImageOptions options = ImageOptionsBuilder.builder() - .withModel("wanx-v1") - .build(); + ImageOptions options = ImageOptionsBuilder.builder().withModel("wanx-v1").build(); ImagePrompt imagePrompt = new ImagePrompt(input, options); @@ -46,4 +45,5 @@ public String image(String input) { return "redirect:" + imageUrl; } + } diff --git a/spring-ai-alibaba-examples/function-calling-example/src/main/java/com/alibaba/cloud/ai/example/functioncalling/FunctionCallingController.java b/spring-ai-alibaba-examples/function-calling-example/src/main/java/com/alibaba/cloud/ai/example/functioncalling/FunctionCallingController.java index e25b016..9eb7452 100644 --- a/spring-ai-alibaba-examples/function-calling-example/src/main/java/com/alibaba/cloud/ai/example/functioncalling/FunctionCallingController.java +++ b/spring-ai-alibaba-examples/function-calling-example/src/main/java/com/alibaba/cloud/ai/example/functioncalling/FunctionCallingController.java @@ -36,18 +36,19 @@ public FunctionCallingController(ChatClient.Builder chatClientBuilder) { @GetMapping("/weather-service") public String weatherService(String subject) { return chatClient.prompt() - .function("getWeather", "根据城市查询天气", new MockWeatherService()) - .user(subject) - .call() - .content(); + .function("getWeather", "根据城市查询天气", new MockWeatherService()) + .user(subject) + .call() + .content(); } @GetMapping("/order-detail") public String orderDetail() { return chatClient.prompt() - .functions("getOrderFunction") - .user("帮我查询一下订单, 用户编号为1001, 订单编号为2001") - .call() - .content(); + .functions("getOrderFunction") + .user("帮我查询一下订单, 用户编号为1001, 订单编号为2001") + .call() + .content(); } + } diff --git a/spring-ai-alibaba-examples/helloworld-example/src/main/java/com/alibaba/cloud/ai/example/helloworld/ChatController.java b/spring-ai-alibaba-examples/helloworld-example/src/main/java/com/alibaba/cloud/ai/example/helloworld/ChatController.java index b66ff7c..1474b00 100644 --- a/spring-ai-alibaba-examples/helloworld-example/src/main/java/com/alibaba/cloud/ai/example/helloworld/ChatController.java +++ b/spring-ai-alibaba-examples/helloworld-example/src/main/java/com/alibaba/cloud/ai/example/helloworld/ChatController.java @@ -31,9 +31,7 @@ public ChatController(ChatClient.Builder builder) { @GetMapping("/chat") public String chat(String input) { - return this.chatClient.prompt() - .user(input) - .call() - .content(); + return this.chatClient.prompt().user(input).call().content(); } + } diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/Application.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/Application.java index 43573e9..f67d911 100644 --- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/Application.java +++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/Application.java @@ -32,15 +32,12 @@ public static void main(String[] args) { // In the real world, ingesting documents would often happen separately, on a CI // server or similar. @Bean - CommandLineRunner ingestTermOfServiceToVectorStore( - EmbeddingModel embeddingModel, VectorStore vectorStore, + CommandLineRunner ingestTermOfServiceToVectorStore(EmbeddingModel embeddingModel, VectorStore vectorStore, @Value("classpath:rag/terms-of-service.txt") Resource termsOfServiceDocs) { return args -> { // Ingest the document into the vector store - vectorStore.write( - new TokenTextSplitter().transform( - new TextReader(termsOfServiceDocs).read())); + vectorStore.write(new TokenTextSplitter().transform(new TextReader(termsOfServiceDocs).read())); vectorStore.similaritySearch("Cancelling Bookings").forEach(doc -> { logger.info("Similar Document: {}", doc.getContent()); @@ -57,4 +54,5 @@ public VectorStore vectorStore(EmbeddingModel embeddingModel) { public ChatMemory chatMemory() { return new InMemoryChatMemory(); } + } diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/AssistantService.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/AssistantService.java index 9a75f25..2aea461 100644 --- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/AssistantService.java +++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/AssistantService.java @@ -10,13 +10,14 @@ @AnonymousAllowed public class AssistantService { - private final CustomerSupportAssistant agent; + private final CustomerSupportAssistant agent; - public AssistantService(CustomerSupportAssistant agent) { - this.agent = agent; - } + public AssistantService(CustomerSupportAssistant agent) { + this.agent = agent; + } + + public Flux chat(String chatId, String userMessage) { + return agent.chat(chatId, userMessage); + } - public Flux chat(String chatId, String userMessage) { - return agent.chat(chatId, userMessage); - } } diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/BookingService.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/BookingService.java index d07652d..7d9d431 100644 --- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/BookingService.java +++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/BookingService.java @@ -11,13 +11,15 @@ @BrowserCallable @AnonymousAllowed public class BookingService { - private final FlightBookingService flightBookingService; - public BookingService(FlightBookingService flightBookingService) { - this.flightBookingService = flightBookingService; - } + private final FlightBookingService flightBookingService; + + public BookingService(FlightBookingService flightBookingService) { + this.flightBookingService = flightBookingService; + } + + public List getBookings() { + return flightBookingService.getBookings(); + } - public List getBookings() { - return flightBookingService.getBookings(); - } } diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/Booking.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/Booking.java index a9c1d48..be2f452 100644 --- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/Booking.java +++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/Booking.java @@ -4,87 +4,95 @@ public class Booking { - private String bookingNumber; - private LocalDate date; - private LocalDate bookingTo; - private Customer customer; - private String from; - private String to; - private BookingStatus bookingStatus; - private BookingClass bookingClass; - - public Booking(String bookingNumber, LocalDate date, Customer customer, BookingStatus bookingStatus, String from, String to, BookingClass bookingClass) { - this.bookingNumber = bookingNumber; - this.date = date; - this.customer = customer; - this.bookingStatus = bookingStatus; - this.from = from; - this.to = to; - this.bookingClass = bookingClass; - } - - - public String getBookingNumber() { - return bookingNumber; - } - - public void setBookingNumber(String bookingNumber) { - this.bookingNumber = bookingNumber; - } - - public LocalDate getDate() { - return date; - } - - public void setDate(LocalDate date) { - this.date = date; - } - - public LocalDate getBookingTo() { - return bookingTo; - } - - public void setBookingTo(LocalDate bookingTo) { - this.bookingTo = bookingTo; - } - - public Customer getCustomer() { - return customer; - } - - public void setCustomer(Customer customer) { - this.customer = customer; - } - - public BookingStatus getBookingStatus() { - return bookingStatus; - } - - public void setBookingStatus(BookingStatus bookingStatus) { - this.bookingStatus = bookingStatus; - } - - public String getFrom() { - return from; - } - - public void setFrom(String from) { - this.from = from; - } - - public String getTo() { - return to; - } - - public void setTo(String to) { - this.to = to; - } - - public BookingClass getBookingClass() { - return bookingClass; - } - - public void setBookingClass(BookingClass bookingClass) { - this.bookingClass = bookingClass; - } + private String bookingNumber; + + private LocalDate date; + + private LocalDate bookingTo; + + private Customer customer; + + private String from; + + private String to; + + private BookingStatus bookingStatus; + + private BookingClass bookingClass; + + public Booking(String bookingNumber, LocalDate date, Customer customer, BookingStatus bookingStatus, String from, + String to, BookingClass bookingClass) { + this.bookingNumber = bookingNumber; + this.date = date; + this.customer = customer; + this.bookingStatus = bookingStatus; + this.from = from; + this.to = to; + this.bookingClass = bookingClass; + } + + public String getBookingNumber() { + return bookingNumber; + } + + public void setBookingNumber(String bookingNumber) { + this.bookingNumber = bookingNumber; + } + + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public LocalDate getBookingTo() { + return bookingTo; + } + + public void setBookingTo(LocalDate bookingTo) { + this.bookingTo = bookingTo; + } + + public Customer getCustomer() { + return customer; + } + + public void setCustomer(Customer customer) { + this.customer = customer; + } + + public BookingStatus getBookingStatus() { + return bookingStatus; + } + + public void setBookingStatus(BookingStatus bookingStatus) { + this.bookingStatus = bookingStatus; + } + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getTo() { + return to; + } + + public void setTo(String to) { + this.to = to; + } + + public BookingClass getBookingClass() { + return bookingClass; + } + + public void setBookingClass(BookingClass bookingClass) { + this.bookingClass = bookingClass; + } + } \ No newline at end of file diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/BookingClass.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/BookingClass.java index 4d29110..e50c394 100644 --- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/BookingClass.java +++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/BookingClass.java @@ -1,5 +1,7 @@ package ai.spring.demo.ai.playground.data; public enum BookingClass { - ECONOMY, PREMIUM_ECONOMY, BUSINESS + + ECONOMY, PREMIUM_ECONOMY, BUSINESS + } diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/BookingData.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/BookingData.java index 588c09a..8da6775 100644 --- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/BookingData.java +++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/BookingData.java @@ -5,23 +5,24 @@ public class BookingData { - private List customers = new ArrayList<>(); - private List bookings = new ArrayList<>(); + private List customers = new ArrayList<>(); + private List bookings = new ArrayList<>(); - public List getCustomers() { - return customers; - } + public List getCustomers() { + return customers; + } - public void setCustomers(List customers) { - this.customers = customers; - } + public void setCustomers(List customers) { + this.customers = customers; + } - public List getBookings() { - return bookings; - } + public List getBookings() { + return bookings; + } + + public void setBookings(List bookings) { + this.bookings = bookings; + } - public void setBookings(List bookings) { - this.bookings = bookings; - } } diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/BookingStatus.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/BookingStatus.java index 19346a2..8f88c66 100644 --- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/BookingStatus.java +++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/BookingStatus.java @@ -1,5 +1,7 @@ package ai.spring.demo.ai.playground.data; public enum BookingStatus { - CONFIRMED, COMPLETED, CANCELLED + + CONFIRMED, COMPLETED, CANCELLED + } diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/Customer.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/Customer.java index 1643c96..3acaf48 100644 --- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/Customer.java +++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/data/Customer.java @@ -5,30 +5,31 @@ public class Customer { - private String name; + private String name; - private List bookings = new ArrayList<>(); + private List bookings = new ArrayList<>(); - public Customer() { - } + public Customer() { + } - public Customer(String name) { - this.name = name; - } + public Customer(String name) { + this.name = name; + } - public String getName() { - return name; - } + public String getName() { + return name; + } - public void setName(String name) { - this.name = name; - } + public void setName(String name) { + this.name = name; + } - public List getBookings() { - return bookings; - } + public List getBookings() { + return bookings; + } + + public void setBookings(List bookings) { + this.bookings = bookings; + } - public void setBookings(List bookings) { - this.bookings = bookings; - } } \ No newline at end of file diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/BookingTools.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/BookingTools.java index be2b249..bd74f44 100644 --- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/BookingTools.java +++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/BookingTools.java @@ -18,62 +18,56 @@ @Configuration public class BookingTools { - private static final Logger logger = LoggerFactory.getLogger(BookingTools.class); + private static final Logger logger = LoggerFactory.getLogger(BookingTools.class); - @Autowired - private FlightBookingService flightBookingService; + @Autowired + private FlightBookingService flightBookingService; - public record BookingDetailsRequest(String bookingNumber, String name) { - } + public record BookingDetailsRequest(String bookingNumber, String name) { + } - public record ChangeBookingDatesRequest(String bookingNumber, String name, String date, - String from, String to) { - } + public record ChangeBookingDatesRequest(String bookingNumber, String name, String date, String from, String to) { + } - public record CancelBookingRequest(String bookingNumber, String name) { - } + public record CancelBookingRequest(String bookingNumber, String name) { + } - @JsonInclude(Include.NON_NULL) - public record BookingDetails(String bookingNumber, - String name, - LocalDate date, - BookingStatus bookingStatus, - String from, - String to, - String bookingClass) { - } + @JsonInclude(Include.NON_NULL) + public record BookingDetails(String bookingNumber, String name, LocalDate date, BookingStatus bookingStatus, + String from, String to, String bookingClass) { + } - @Bean - @Description("获取机票预定详细信息") - public Function getBookingDetails() { - return request -> { - try { - return flightBookingService.getBookingDetails(request.bookingNumber(), request.name()); - } - catch (Exception e) { - logger.warn("Booking details: {}", NestedExceptionUtils.getMostSpecificCause(e).getMessage()); - return new BookingDetails(request.bookingNumber(), request.name(), - null, null, null, null, null); - } - }; - } + @Bean + @Description("获取机票预定详细信息") + public Function getBookingDetails() { + return request -> { + try { + return flightBookingService.getBookingDetails(request.bookingNumber(), request.name()); + } + catch (Exception e) { + logger.warn("Booking details: {}", NestedExceptionUtils.getMostSpecificCause(e).getMessage()); + return new BookingDetails(request.bookingNumber(), request.name(), null, null, null, null, null); + } + }; + } - @Bean - @Description("修改机票预定日期") - public Function changeBooking() { - return request -> { - flightBookingService.changeBooking(request.bookingNumber(), request.name(), - request.date(), request.from(), request.to()); - return ""; - }; - } + @Bean + @Description("修改机票预定日期") + public Function changeBooking() { + return request -> { + flightBookingService.changeBooking(request.bookingNumber(), request.name(), request.date(), request.from(), + request.to()); + return ""; + }; + } + + @Bean + @Description("取消机票预定") + public Function cancelBooking() { + return request -> { + flightBookingService.cancelBooking(request.bookingNumber(), request.name()); + return ""; + }; + } - @Bean - @Description("取消机票预定") - public Function cancelBooking() { - return request -> { - flightBookingService.cancelBooking(request.bookingNumber(), request.name()); - return ""; - }; - } } diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/CustomerSupportAssistant.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/CustomerSupportAssistant.java index 52894df..94583c4 100644 --- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/CustomerSupportAssistant.java +++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/CustomerSupportAssistant.java @@ -75,11 +75,11 @@ public CustomerSupportAssistant(ChatClient.Builder modelBuilder, VectorStore vec public Flux chat(String chatId, String userMessageContent) { return this.chatClient.prompt() - .system(s -> s.param("current_date", LocalDate.now().toString())) - .user(userMessageContent) - .advisors(a -> a - .param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId) - .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100)) - .stream().content(); + .system(s -> s.param("current_date", LocalDate.now().toString())) + .user(userMessageContent) + .advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100)) + .stream() + .content(); } + } \ No newline at end of file diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/FlightBookingService.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/FlightBookingService.java index a4f0553..bd00205 100644 --- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/FlightBookingService.java +++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/FlightBookingService.java @@ -13,88 +13,85 @@ @Service public class FlightBookingService { - private final BookingData db; - - public FlightBookingService() { - db = new BookingData(); - - initDemoData(); - } - - private void initDemoData() { - List names = List.of("云小宝", "李千问", "张百炼", "王通义", "刘魔搭"); - List airportCodes = List.of("北京", "上海", "广州", "深圳", "杭州", "南京", "青岛", "成都", "武汉", "西安", "重庆", "大连", "天津"); - Random random = new Random(); - - var customers = new ArrayList(); - var bookings = new ArrayList(); - - for (int i = 0; i < 5; i++) { - String name = names.get(i); - String from = airportCodes.get(random.nextInt(airportCodes.size())); - String to = airportCodes.get(random.nextInt(airportCodes.size())); - BookingClass bookingClass = BookingClass.values()[random.nextInt(BookingClass.values().length)]; - Customer customer = new Customer(); - customer.setName(name); - - LocalDate date = LocalDate.now().plusDays(2*(i+1)); - - Booking booking = new Booking("10" + (i + 1), date, customer, BookingStatus.CONFIRMED, from, to, bookingClass); - customer.getBookings().add(booking); - - customers.add(customer); - bookings.add(booking); - } - - // Reset the database on each start - db.setCustomers(customers); - db.setBookings(bookings); - } - - public List getBookings() { - return db.getBookings().stream().map(this::toBookingDetails).toList(); - } - - private Booking findBooking(String bookingNumber, String name) { - return db.getBookings().stream() - .filter(b -> b.getBookingNumber().equalsIgnoreCase(bookingNumber)) - .filter(b -> b.getCustomer().getName().equalsIgnoreCase(name)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException("Booking not found")); - } - - public BookingDetails getBookingDetails(String bookingNumber, String name) { - var booking = findBooking(bookingNumber, name); - return toBookingDetails(booking); - } - - public void changeBooking(String bookingNumber, String name, String newDate, String from, String to) { - var booking = findBooking(bookingNumber, name); - if(booking.getDate().isBefore(LocalDate.now().plusDays(1))){ - throw new IllegalArgumentException("Booking cannot be changed within 24 hours of the start date."); - } - booking.setDate(LocalDate.parse(newDate)); - booking.setFrom(from); - booking.setTo(to); - } - - public void cancelBooking(String bookingNumber, String name) { - var booking = findBooking(bookingNumber, name); - if (booking.getDate().isBefore(LocalDate.now().plusDays(2))) { - throw new IllegalArgumentException("Booking cannot be cancelled within 48 hours of the start date."); - } - booking.setBookingStatus(BookingStatus.CANCELLED); - } - - private BookingDetails toBookingDetails(Booking booking){ - return new BookingDetails( - booking.getBookingNumber(), - booking.getCustomer().getName(), - booking.getDate(), - booking.getBookingStatus(), - booking.getFrom(), - booking.getTo(), - booking.getBookingClass().toString() - ); - } + private final BookingData db; + + public FlightBookingService() { + db = new BookingData(); + + initDemoData(); + } + + private void initDemoData() { + List names = List.of("云小宝", "李千问", "张百炼", "王通义", "刘魔搭"); + List airportCodes = List.of("北京", "上海", "广州", "深圳", "杭州", "南京", "青岛", "成都", "武汉", "西安", "重庆", "大连", + "天津"); + Random random = new Random(); + + var customers = new ArrayList(); + var bookings = new ArrayList(); + + for (int i = 0; i < 5; i++) { + String name = names.get(i); + String from = airportCodes.get(random.nextInt(airportCodes.size())); + String to = airportCodes.get(random.nextInt(airportCodes.size())); + BookingClass bookingClass = BookingClass.values()[random.nextInt(BookingClass.values().length)]; + Customer customer = new Customer(); + customer.setName(name); + + LocalDate date = LocalDate.now().plusDays(2 * (i + 1)); + + Booking booking = new Booking("10" + (i + 1), date, customer, BookingStatus.CONFIRMED, from, to, + bookingClass); + customer.getBookings().add(booking); + + customers.add(customer); + bookings.add(booking); + } + + // Reset the database on each start + db.setCustomers(customers); + db.setBookings(bookings); + } + + public List getBookings() { + return db.getBookings().stream().map(this::toBookingDetails).toList(); + } + + private Booking findBooking(String bookingNumber, String name) { + return db.getBookings() + .stream() + .filter(b -> b.getBookingNumber().equalsIgnoreCase(bookingNumber)) + .filter(b -> b.getCustomer().getName().equalsIgnoreCase(name)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("Booking not found")); + } + + public BookingDetails getBookingDetails(String bookingNumber, String name) { + var booking = findBooking(bookingNumber, name); + return toBookingDetails(booking); + } + + public void changeBooking(String bookingNumber, String name, String newDate, String from, String to) { + var booking = findBooking(bookingNumber, name); + if (booking.getDate().isBefore(LocalDate.now().plusDays(1))) { + throw new IllegalArgumentException("Booking cannot be changed within 24 hours of the start date."); + } + booking.setDate(LocalDate.parse(newDate)); + booking.setFrom(from); + booking.setTo(to); + } + + public void cancelBooking(String bookingNumber, String name) { + var booking = findBooking(bookingNumber, name); + if (booking.getDate().isBefore(LocalDate.now().plusDays(2))) { + throw new IllegalArgumentException("Booking cannot be cancelled within 48 hours of the start date."); + } + booking.setBookingStatus(BookingStatus.CANCELLED); + } + + private BookingDetails toBookingDetails(Booking booking) { + return new BookingDetails(booking.getBookingNumber(), booking.getCustomer().getName(), booking.getDate(), + booking.getBookingStatus(), booking.getFrom(), booking.getTo(), booking.getBookingClass().toString()); + } + } diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/LoggingAdvisor.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/LoggingAdvisor.java index 9591eb4..8b5152c 100644 --- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/LoggingAdvisor.java +++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/LoggingAdvisor.java @@ -12,4 +12,5 @@ public AdvisedRequest adviseRequest(AdvisedRequest request, Map System.out.println("Request: " + request); return request; } + } \ No newline at end of file diff --git a/spring-ai-alibaba-examples/prompt-example/src/main/java/com/alibaba/cloud/ai/example/prompt/stuff/StuffController.java b/spring-ai-alibaba-examples/prompt-example/src/main/java/com/alibaba/cloud/ai/example/prompt/stuff/StuffController.java index 21107a6..7dc20b1 100644 --- a/spring-ai-alibaba-examples/prompt-example/src/main/java/com/alibaba/cloud/ai/example/prompt/stuff/StuffController.java +++ b/spring-ai-alibaba-examples/prompt-example/src/main/java/com/alibaba/cloud/ai/example/prompt/stuff/StuffController.java @@ -28,6 +28,7 @@ public class StuffController { public StuffController(ChatClient.Builder builder) { this.chatClient = builder.build(); } + @GetMapping("/ai/stuff") public Completion completion(@RequestParam(value = "message", defaultValue = "Which athletes won the mixed doubles gold medal in curling at the 2022 Winter Olympics?'") String message, @@ -37,7 +38,8 @@ public Completion completion(@RequestParam(value = "message", map.put("question", message); if (stuffit) { map.put("context", docsToStuffResource); - } else { + } + else { map.put("context", ""); } Prompt prompt = promptTemplate.create(map); diff --git a/spring-ai-alibaba-examples/rag-example/src/main/java/org/springframework/ai/reader/JsonReader.java b/spring-ai-alibaba-examples/rag-example/src/main/java/org/springframework/ai/reader/JsonReader.java index 4fde76a..0fa857f 100644 --- a/spring-ai-alibaba-examples/rag-example/src/main/java/org/springframework/ai/reader/JsonReader.java +++ b/spring-ai-alibaba-examples/rag-example/src/main/java/org/springframework/ai/reader/JsonReader.java @@ -77,8 +77,8 @@ public List get() { if (rootNode.isArray()) { return StreamSupport.stream(rootNode.spliterator(), true) - .map(jsonNode -> parseJsonNode(jsonNode, objectMapper)) - .toList(); + .map(jsonNode -> parseJsonNode(jsonNode, objectMapper)) + .toList(); } else { return Collections.singletonList(parseJsonNode(rootNode, objectMapper)); diff --git a/spring-ai-alibaba-starter/pom.xml b/spring-ai-alibaba-starter/pom.xml index ad0320e..1f83acb 100644 --- a/spring-ai-alibaba-starter/pom.xml +++ b/spring-ai-alibaba-starter/pom.xml @@ -45,4 +45,4 @@ - \ No newline at end of file +