Commit 7fca38ce1e270d8831b5ba426a2e82df6b009474
1 parent
fe63bda4
【重构】AI:替换 spring-ai 实现
Showing
96 changed files
with
99 additions
and
5416 deletions
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessageSendRespVO.java
| ... | ... | @@ -28,7 +28,7 @@ public class AiChatMessageSendRespVO { |
| 28 | 28 | @Schema(description = "聊天内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你好啊") |
| 29 | 29 | private String content; |
| 30 | 30 | |
| 31 | - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-05-12 12:51") | |
| 31 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 32 | 32 | private LocalDateTime createTime; |
| 33 | 33 | |
| 34 | 34 | } | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/vo/AiChatModalDallConfigVO.java
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java
| ... | ... | @@ -6,10 +6,8 @@ import cn.iocoder.yudao.framework.ai.core.exception.AiException; |
| 6 | 6 | import org.springframework.ai.image.ImageGeneration; |
| 7 | 7 | import org.springframework.ai.image.ImagePrompt; |
| 8 | 8 | import org.springframework.ai.image.ImageResponse; |
| 9 | -import org.springframework.ai.models.openai.OpenAiImageClient; | |
| 10 | -import org.springframework.ai.models.openai.OpenAiImageOptions; | |
| 11 | -import org.springframework.ai.models.openai.enums.OpenAiImageModelEnum; | |
| 12 | -import org.springframework.ai.models.openai.enums.OpenAiImageStyleEnum; | |
| 9 | +import cn.iocoder.yudao.framework.ai.core.enums.OpenAiImageModelEnum; | |
| 10 | +import cn.iocoder.yudao.framework.ai.core.enums.OpenAiImageStyleEnum; | |
| 13 | 11 | import org.springframework.ai.models.midjourney.api.MidjourneyInteractionsApi; |
| 14 | 12 | import org.springframework.ai.models.midjourney.api.req.ReRollReq; |
| 15 | 13 | import org.springframework.ai.models.midjourney.webSocket.MidjourneyWebSocketStarter; |
| ... | ... | @@ -29,6 +27,8 @@ import cn.iocoder.yudao.module.ai.service.AiImageService; |
| 29 | 27 | import jakarta.annotation.PostConstruct; |
| 30 | 28 | import lombok.AllArgsConstructor; |
| 31 | 29 | import lombok.extern.slf4j.Slf4j; |
| 30 | +import org.springframework.ai.openai.OpenAiImageClient; | |
| 31 | +import org.springframework.ai.openai.OpenAiImageOptions; | |
| 32 | 32 | import org.springframework.stereotype.Service; |
| 33 | 33 | import org.springframework.transaction.annotation.Transactional; |
| 34 | 34 | |
| ... | ... | @@ -95,8 +95,8 @@ public class AiImageServiceImpl implements AiImageService { |
| 95 | 95 | try { |
| 96 | 96 | // 转换openai 参数 |
| 97 | 97 | OpenAiImageOptions openAiImageOptions = new OpenAiImageOptions(); |
| 98 | - openAiImageOptions.setModel(openAiImageModelEnum); | |
| 99 | - openAiImageOptions.setStyle(openAiImageStyleEnum); | |
| 98 | + openAiImageOptions.setModel(openAiImageModelEnum.getModel()); | |
| 99 | + openAiImageOptions.setStyle(openAiImageStyleEnum.getStyle()); | |
| 100 | 100 | openAiImageOptions.setSize(req.getSize()); |
| 101 | 101 | ImageResponse imageResponse = openAiImageClient.call(new ImagePrompt(req.getPrompt(), openAiImageOptions)); |
| 102 | 102 | // 发送 | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/midjourneyHandler/YuDaoMidjourneyMessageHandler.java
| ... | ... | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.ai.service.midjourneyHandler; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | 4 | import cn.hutool.core.util.StrUtil; |
| 5 | +import com.alibaba.fastjson.JSON; | |
| 5 | 6 | import org.springframework.ai.models.midjourney.MidjourneyMessage; |
| 6 | 7 | import org.springframework.ai.models.midjourney.constants.MidjourneyGennerateStatusEnum; |
| 7 | 8 | import org.springframework.ai.models.midjourney.webSocket.MidjourneyMessageHandler; |
| ... | ... | @@ -11,7 +12,6 @@ import cn.iocoder.yudao.module.ai.convert.AiImageConvert; |
| 11 | 12 | import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; |
| 12 | 13 | import cn.iocoder.yudao.module.ai.dal.mysql.AiImageMapper; |
| 13 | 14 | import cn.iocoder.yudao.module.ai.enums.AiImageDrawingStatusEnum; |
| 14 | -import com.alibaba.fastjson2.JSON; | |
| 15 | 15 | import lombok.AllArgsConstructor; |
| 16 | 16 | import lombok.extern.slf4j.Slf4j; |
| 17 | 17 | import org.springframework.stereotype.Component; | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/pom.xml
| ... | ... | @@ -12,140 +12,49 @@ |
| 12 | 12 | <artifactId>yudao-spring-boot-starter-ai</artifactId> |
| 13 | 13 | <!-- TODO 芋艿:这里需要进一步减少 --> |
| 14 | 14 | |
| 15 | - <properties> | |
| 16 | - <maven.compiler.source>21</maven.compiler.source> | |
| 17 | - <maven.compiler.target>21</maven.compiler.target> | |
| 18 | - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |
| 19 | - </properties> | |
| 20 | 15 | <dependencies> |
| 21 | - <!-- TODO fan:这里包,要进一步减少 --> | |
| 22 | - <dependency> | |
| 23 | - <groupId>org.springframework</groupId> | |
| 24 | - <artifactId>spring-core</artifactId> | |
| 25 | - </dependency> | |
| 26 | - <dependency> | |
| 27 | - <groupId>com.fasterxml.jackson.core</groupId> | |
| 28 | - <artifactId>jackson-databind</artifactId> | |
| 29 | - </dependency> | |
| 30 | - <dependency> | |
| 31 | - <groupId>org.springframework</groupId> | |
| 32 | - <artifactId>spring-context</artifactId> | |
| 33 | - </dependency> | |
| 34 | - <dependency> | |
| 35 | - <groupId>net.jodah</groupId> | |
| 36 | - <artifactId>typetools</artifactId> | |
| 37 | - <version>0.6.3</version> | |
| 38 | - <scope>compile</scope> | |
| 39 | - </dependency> | |
| 40 | - <dependency> | |
| 41 | - <groupId>com.github.victools</groupId> | |
| 42 | - <artifactId>jsonschema-module-jackson</artifactId> | |
| 43 | - <version>4.31.1</version> | |
| 44 | - <scope>compile</scope> | |
| 45 | - </dependency> | |
| 46 | - <dependency> | |
| 47 | - <groupId>com.github.victools</groupId> | |
| 48 | - <artifactId>jsonschema-module-swagger-2</artifactId> | |
| 49 | - <version>4.33.1</version> | |
| 50 | - </dependency> | |
| 51 | - <dependency> | |
| 52 | - <groupId>com.github.victools</groupId> | |
| 53 | - <artifactId>jsonschema-generator</artifactId> | |
| 54 | - <version>4.31.1</version> | |
| 55 | - <scope>compile</scope> | |
| 56 | - </dependency> | |
| 57 | - <dependency> | |
| 58 | - <groupId>io.projectreactor</groupId> | |
| 59 | - <artifactId>reactor-core</artifactId> | |
| 60 | - </dependency> | |
| 61 | - <dependency> | |
| 62 | - <groupId>org.springframework.cloud</groupId> | |
| 63 | - <artifactId>spring-cloud-function-context</artifactId> | |
| 64 | - <version>4.1.0</version> | |
| 65 | - <scope>compile</scope> | |
| 66 | - </dependency> | |
| 67 | - <dependency> | |
| 68 | - <groupId>org.antlr</groupId> | |
| 69 | - <artifactId>stringtemplate</artifactId> | |
| 70 | - <version>4.0.2</version> | |
| 71 | - <scope>compile</scope> | |
| 72 | - </dependency> | |
| 73 | - <dependency> | |
| 74 | - <groupId>org.projectlombok</groupId> | |
| 75 | - <artifactId>lombok</artifactId> | |
| 76 | - </dependency> | |
| 77 | - <dependency> | |
| 78 | - <groupId>org.springframework</groupId> | |
| 79 | - <artifactId>spring-web</artifactId> | |
| 80 | - </dependency> | |
| 81 | - <dependency> | |
| 82 | - <groupId>org.springframework</groupId> | |
| 83 | - <artifactId>spring-webflux</artifactId> | |
| 84 | - </dependency> | |
| 85 | - <dependency> | |
| 86 | - <groupId>org.springframework.retry</groupId> | |
| 87 | - <artifactId>spring-retry</artifactId> | |
| 88 | - </dependency> | |
| 89 | - <dependency> | |
| 90 | - <groupId>junit</groupId> | |
| 91 | - <artifactId>junit</artifactId> | |
| 92 | - <scope>test</scope> | |
| 93 | - </dependency> | |
| 94 | - <dependency> | |
| 95 | - <groupId>cn.hutool</groupId> | |
| 96 | - <artifactId>hutool-all</artifactId> | |
| 97 | - <scope>test</scope> | |
| 98 | - </dependency> | |
| 99 | 16 | <dependency> |
| 100 | - <groupId>com.squareup.okhttp3</groupId> | |
| 101 | - <artifactId>okhttp</artifactId> | |
| 102 | - <version>4.12.0</version> | |
| 103 | - <scope>test</scope> | |
| 17 | + <groupId>io.springboot.ai</groupId> | |
| 18 | + <artifactId>spring-ai-core</artifactId> | |
| 19 | + <version>1.0.3</version> | |
| 104 | 20 | </dependency> |
| 105 | 21 | <dependency> |
| 106 | - <groupId>io.projectreactor.netty</groupId> | |
| 107 | - <artifactId>reactor-netty</artifactId> | |
| 22 | + <groupId>io.springboot.ai</groupId> | |
| 23 | + <artifactId>spring-ai-openai</artifactId> | |
| 24 | + <version>1.0.3</version> | |
| 108 | 25 | </dependency> |
| 26 | + | |
| 109 | 27 | <dependency> |
| 110 | - <groupId>cn.hutool</groupId> | |
| 111 | - <artifactId>hutool-all</artifactId> | |
| 28 | + <groupId>cn.iocoder.boot</groupId> | |
| 29 | + <artifactId>yudao-common</artifactId> | |
| 112 | 30 | </dependency> |
| 31 | + | |
| 113 | 32 | <!-- 阿里云 通义千问 --> |
| 114 | 33 | <dependency> |
| 115 | 34 | <groupId>com.alibaba</groupId> |
| 116 | 35 | <artifactId>dashscope-sdk-java</artifactId> |
| 117 | 36 | <version>2.11.0</version> |
| 118 | 37 | </dependency> |
| 38 | + | |
| 119 | 39 | <dependency> |
| 120 | - <groupId>org.apache.httpcomponents</groupId> | |
| 121 | - <artifactId>httpclient</artifactId> | |
| 122 | - <version>4.5.14</version> | |
| 123 | - <scope>compile</scope> | |
| 40 | + <groupId>junit</groupId> | |
| 41 | + <artifactId>junit</artifactId> | |
| 42 | + <scope>test</scope> | |
| 124 | 43 | </dependency> |
| 44 | + | |
| 45 | + <!-- TODO fan:这里包,要进一步减少 --> | |
| 46 | + | |
| 125 | 47 | <dependency> |
| 126 | 48 | <groupId>org.springframework.boot</groupId> |
| 127 | 49 | <artifactId>spring-boot-starter-websocket</artifactId> |
| 128 | 50 | </dependency> |
| 129 | - <!-- JSON 处理库,如 Jackson --> | |
| 130 | - <dependency> | |
| 131 | - <groupId>com.fasterxml.jackson.core</groupId> | |
| 132 | - <artifactId>jackson-databind</artifactId> | |
| 133 | - </dependency> | |
| 134 | - <dependency> | |
| 135 | - <groupId>com.alibaba.fastjson2</groupId> | |
| 136 | - <artifactId>fastjson2</artifactId> | |
| 137 | - <version>2.0.45</version> | |
| 138 | - </dependency> | |
| 51 | + | |
| 139 | 52 | <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> |
| 140 | 53 | <dependency> |
| 141 | 54 | <groupId>com.squareup.okhttp3</groupId> |
| 142 | 55 | <artifactId>okhttp</artifactId> |
| 143 | 56 | </dependency> |
| 144 | 57 | <dependency> |
| 145 | - <groupId>com.google.guava</groupId> | |
| 146 | - <artifactId>guava</artifactId> | |
| 147 | - </dependency> | |
| 148 | - <dependency> | |
| 149 | 58 | <groupId>net.dv8tion</groupId> |
| 150 | 59 | <artifactId>JDA</artifactId> |
| 151 | 60 | <version>5.0.0-beta.21</version> |
| ... | ... | @@ -156,10 +65,6 @@ |
| 156 | 65 | <!-- </exclusion>--> |
| 157 | 66 | <!-- </exclusions>--> |
| 158 | 67 | </dependency> |
| 159 | - <dependency> | |
| 160 | - <groupId>cn.iocoder.boot</groupId> | |
| 161 | - <artifactId>yudao-common</artifactId> | |
| 162 | - </dependency> | |
| 163 | 68 | </dependencies> |
| 164 | 69 | |
| 165 | 70 | </project> |
| 166 | 71 | \ No newline at end of file | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/config/YudaoAiAutoConfiguration.java
| ... | ... | @@ -11,9 +11,6 @@ import org.springframework.ai.models.xinghuo.api.XingHuoApi; |
| 11 | 11 | import org.springframework.ai.models.yiyan.YiYanChatClient; |
| 12 | 12 | import org.springframework.ai.models.yiyan.YiYanOptions; |
| 13 | 13 | import org.springframework.ai.models.yiyan.api.YiYanApi; |
| 14 | -import org.springframework.ai.models.openai.OpenAiImageApi; | |
| 15 | -import org.springframework.ai.models.openai.OpenAiImageClient; | |
| 16 | -import org.springframework.ai.models.openai.OpenAiImageOptions; | |
| 17 | 14 | import org.springframework.ai.models.midjourney.MidjourneyConfig; |
| 18 | 15 | import org.springframework.ai.models.midjourney.MidjourneyMessage; |
| 19 | 16 | import org.springframework.ai.models.midjourney.api.MidjourneyInteractionsApi; |
| ... | ... | @@ -22,6 +19,10 @@ import org.springframework.ai.models.midjourney.webSocket.MidjourneyWebSocketSta |
| 22 | 19 | import org.springframework.ai.models.midjourney.webSocket.listener.MidjourneyMessageListener; |
| 23 | 20 | import lombok.extern.slf4j.Slf4j; |
| 24 | 21 | import org.jetbrains.annotations.NotNull; |
| 22 | +import org.springframework.ai.openai.OpenAiImageClient; | |
| 23 | +import org.springframework.ai.openai.OpenAiImageOptions; | |
| 24 | +import org.springframework.ai.openai.api.OpenAiImageApi; | |
| 25 | +import org.springframework.ai.retry.RetryUtils; | |
| 25 | 26 | import org.springframework.boot.autoconfigure.AutoConfiguration; |
| 26 | 27 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; |
| 27 | 28 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
| ... | ... | @@ -72,10 +73,10 @@ public class YudaoAiAutoConfiguration { |
| 72 | 73 | YudaoAiProperties.QianWenProperties qianWenProperties = yudaoAiProperties.getQianwen(); |
| 73 | 74 | // 转换配置 |
| 74 | 75 | QianWenOptions qianWenOptions = new QianWenOptions(); |
| 75 | - qianWenOptions.setTopK(qianWenProperties.getTopK()); | |
| 76 | +// qianWenOptions.setTopK(qianWenProperties.getTopK()); TODO 芋艿:后续弄 | |
| 76 | 77 | qianWenOptions.setTopP(qianWenProperties.getTopP()); |
| 77 | 78 | qianWenOptions.setMaxTokens(qianWenProperties.getMaxTokens()); |
| 78 | - qianWenOptions.setTemperature(qianWenProperties.getTemperature()); | |
| 79 | +// qianWenOptions.setTemperature(qianWenProperties.getTemperature()); TODO 芋艿:后续弄 | |
| 79 | 80 | return new QianWenChatClient( |
| 80 | 81 | new QianWenApi( |
| 81 | 82 | qianWenProperties.getApiKey(), |
| ... | ... | @@ -91,7 +92,7 @@ public class YudaoAiAutoConfiguration { |
| 91 | 92 | YudaoAiProperties.YiYanProperties yiYanProperties = yudaoAiProperties.getYiyan(); |
| 92 | 93 | // 转换配置 |
| 93 | 94 | YiYanOptions yiYanOptions = new YiYanOptions(); |
| 94 | - yiYanOptions.setTopK(yiYanProperties.getTopK()); | |
| 95 | +// yiYanOptions.setTopK(yiYanProperties.getTopK()); TODO 芋艿:后续弄 | |
| 95 | 96 | yiYanOptions.setTopP(yiYanProperties.getTopP()); |
| 96 | 97 | yiYanOptions.setTemperature(yiYanProperties.getTemperature()); |
| 97 | 98 | yiYanOptions.setMaxOutputTokens(yiYanProperties.getMaxTokens()); |
| ... | ... | @@ -106,19 +107,19 @@ public class YudaoAiAutoConfiguration { |
| 106 | 107 | ); |
| 107 | 108 | } |
| 108 | 109 | |
| 109 | - | |
| 110 | 110 | @Bean |
| 111 | 111 | @ConditionalOnProperty(value = "yudao.ai.openAiImage.enable", havingValue = "true") |
| 112 | 112 | public OpenAiImageClient openAiImageClient(YudaoAiProperties yudaoAiProperties) { |
| 113 | 113 | YudaoAiProperties.OpenAiImageProperties openAiImageProperties = yudaoAiProperties.getOpenAiImage(); |
| 114 | + OpenAiImageOptions openAiImageOptions = new OpenAiImageOptions(); | |
| 115 | + openAiImageOptions.setModel(openAiImageProperties.getModel().getModel()); | |
| 116 | + openAiImageOptions.setStyle(openAiImageProperties.getStyle().getStyle()); | |
| 117 | + openAiImageOptions.setResponseFormat("url"); // TODO 芋艿:OpenAiImageOptions.ResponseFormatEnum.URL.getValue() | |
| 114 | 118 | // 创建 client |
| 115 | 119 | return new OpenAiImageClient( |
| 116 | 120 | new OpenAiImageApi(openAiImageProperties.getApiKey()), |
| 117 | - new OpenAiImageOptions() | |
| 118 | - .setModel(openAiImageProperties.getModel()) | |
| 119 | - .setResponseFormat(OpenAiImageOptions.ResponseFormatEnum.URL.getValue()) | |
| 120 | - .setStyle(openAiImageProperties.getStyle()) | |
| 121 | - ); | |
| 121 | + openAiImageOptions, | |
| 122 | + RetryUtils.DEFAULT_RETRY_TEMPLATE); | |
| 122 | 123 | } |
| 123 | 124 | |
| 124 | 125 | @Bean |
| ... | ... | @@ -157,7 +158,6 @@ public class YudaoAiAutoConfiguration { |
| 157 | 158 | return new MidjourneyInteractionsApi(midjourneyConfig); |
| 158 | 159 | } |
| 159 | 160 | |
| 160 | - | |
| 161 | 161 | private static @NotNull MidjourneyConfig getMidjourneyConfig(ApplicationContext applicationContext, |
| 162 | 162 | YudaoAiProperties.MidjourneyProperties midjourneyProperties) { |
| 163 | 163 | Map<String, String> requestTemplates = new HashMap<>(); | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/config/YudaoAiProperties.java
| ... | ... | @@ -3,8 +3,8 @@ package cn.iocoder.yudao.framework.ai.config; |
| 3 | 3 | import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; |
| 4 | 4 | import org.springframework.ai.models.xinghuo.XingHuoChatModel; |
| 5 | 5 | import org.springframework.ai.models.yiyan.YiYanChatModel; |
| 6 | -import org.springframework.ai.models.openai.enums.OpenAiImageModelEnum; | |
| 7 | -import org.springframework.ai.models.openai.enums.OpenAiImageStyleEnum; | |
| 6 | +import cn.iocoder.yudao.framework.ai.core.enums.OpenAiImageModelEnum; | |
| 7 | +import cn.iocoder.yudao.framework.ai.core.enums.OpenAiImageStyleEnum; | |
| 8 | 8 | import lombok.Data; |
| 9 | 9 | import lombok.experimental.Accessors; |
| 10 | 10 | import org.springframework.boot.context.properties.ConfigurationProperties; |
| ... | ... | @@ -95,6 +95,7 @@ public class YudaoAiProperties { |
| 95 | 95 | @Data |
| 96 | 96 | @Accessors(chain = true) |
| 97 | 97 | public static class OpenAiImageProperties { |
| 98 | + | |
| 98 | 99 | private boolean enable = false; |
| 99 | 100 | |
| 100 | 101 | /** |
| ... | ... | @@ -109,6 +110,7 @@ public class YudaoAiProperties { |
| 109 | 110 | * 风格 |
| 110 | 111 | */ |
| 111 | 112 | private OpenAiImageStyleEnum style = OpenAiImageStyleEnum.VIVID; |
| 113 | + | |
| 112 | 114 | } |
| 113 | 115 | |
| 114 | 116 | @Data | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/openai/enums/OpenAiImageModelEnum.java renamed to yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/enums/OpenAiImageModelEnum.java
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/openai/enums/OpenAiImageStyleEnum.java renamed to yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/enums/OpenAiImageStyleEnum.java
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/ChatException.java renamed to yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/exception/ChatException.java
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/package-info.java renamed to yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/package-info.java
| ... | ... | @@ -12,4 +12,4 @@ |
| 12 | 12 | * 2.4 openai 包:【OpenAI】ChatGPT,拷贝 spring-ai 提供的 models/openai 包 |
| 13 | 13 | * 2.5 midjourney 包:Midjourney,参考 https://github.com/novicezk/midjourney-proxy 实现 |
| 14 | 14 | */ |
| 15 | -package org.springframework.ai; | |
| 16 | 15 | \ No newline at end of file |
| 16 | +package cn.iocoder.yudao.framework.ai; | |
| 17 | 17 | \ No newline at end of file | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/ChatClient.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat; | |
| 18 | - | |
| 19 | - | |
| 20 | -import org.springframework.ai.chat.messages.UserMessage; | |
| 21 | -import org.springframework.ai.chat.prompt.Prompt; | |
| 22 | -import org.springframework.ai.model.ModelClient; | |
| 23 | - | |
| 24 | -@FunctionalInterface | |
| 25 | -public interface ChatClient extends ModelClient<Prompt, ChatResponse> { | |
| 26 | - | |
| 27 | - default String call(String message) { | |
| 28 | - Prompt prompt = new Prompt(new UserMessage(message)); | |
| 29 | - Generation generation = call(prompt).getResult(); | |
| 30 | - return (generation != null) ? generation.getOutput().getContent() : ""; | |
| 31 | - } | |
| 32 | - | |
| 33 | - @Override | |
| 34 | - ChatResponse call(Prompt prompt); | |
| 35 | - | |
| 36 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/ChatResponse.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | -package org.springframework.ai.chat; | |
| 17 | - | |
| 18 | -import org.springframework.ai.chat.metadata.ChatResponseMetadata; | |
| 19 | -import org.springframework.ai.model.ModelResponse; | |
| 20 | -import org.springframework.util.CollectionUtils; | |
| 21 | - | |
| 22 | -import java.util.Collections; | |
| 23 | -import java.util.List; | |
| 24 | -import java.util.Objects; | |
| 25 | - | |
| 26 | -/** | |
| 27 | - * 人工智能提供商返回的聊天完成(例如生成)响应。 | |
| 28 | - * | |
| 29 | - * The chat completion (e.g. generation) response returned by an AI provider. | |
| 30 | - */ | |
| 31 | -public class ChatResponse implements ModelResponse<Generation> { | |
| 32 | - | |
| 33 | - private final ChatResponseMetadata chatResponseMetadata; | |
| 34 | - | |
| 35 | - /** | |
| 36 | - * List of generated messages returned by the AI provider. | |
| 37 | - */ | |
| 38 | - private final List<Generation> generations; | |
| 39 | - | |
| 40 | - /** | |
| 41 | - * Construct a new {@link ChatResponse} instance without metadata. | |
| 42 | - * @param generations the {@link List} of {@link Generation} returned by the AI | |
| 43 | - * provider. | |
| 44 | - */ | |
| 45 | - public ChatResponse(List<Generation> generations) { | |
| 46 | - this(generations, ChatResponseMetadata.NULL); | |
| 47 | - } | |
| 48 | - | |
| 49 | - /** | |
| 50 | - * Construct a new {@link ChatResponse} instance. | |
| 51 | - * @param generations the {@link List} of {@link Generation} returned by the AI | |
| 52 | - * provider. | |
| 53 | - * @param chatResponseMetadata {@link ChatResponseMetadata} containing information | |
| 54 | - * about the use of the AI provider's API. | |
| 55 | - */ | |
| 56 | - public ChatResponse(List<Generation> generations, ChatResponseMetadata chatResponseMetadata) { | |
| 57 | - this.chatResponseMetadata = chatResponseMetadata; | |
| 58 | -// this.generations = List.copyOf(generations); | |
| 59 | - this.generations = Collections.unmodifiableList(generations); | |
| 60 | - } | |
| 61 | - | |
| 62 | - /** | |
| 63 | - * The {@link List} of {@link Generation generated outputs}. | |
| 64 | - * <p> | |
| 65 | - * It is a {@link List} of {@link List lists} because the Prompt could request | |
| 66 | - * multiple output {@link Generation generations}. | |
| 67 | - * @return the {@link List} of {@link Generation generated outputs}. | |
| 68 | - */ | |
| 69 | - | |
| 70 | - @Override | |
| 71 | - public List<Generation> getResults() { | |
| 72 | - return this.generations; | |
| 73 | - } | |
| 74 | - | |
| 75 | - /** | |
| 76 | - * @return Returns the first {@link Generation} in the generations list. | |
| 77 | - */ | |
| 78 | - public Generation getResult() { | |
| 79 | - if (CollectionUtils.isEmpty(this.generations)) { | |
| 80 | - return null; | |
| 81 | - } | |
| 82 | - return this.generations.get(0); | |
| 83 | - } | |
| 84 | - | |
| 85 | - /** | |
| 86 | - * @return Returns {@link ChatResponseMetadata} containing information about the use | |
| 87 | - * of the AI provider's API. | |
| 88 | - */ | |
| 89 | - @Override | |
| 90 | - public ChatResponseMetadata getMetadata() { | |
| 91 | - return this.chatResponseMetadata; | |
| 92 | - } | |
| 93 | - | |
| 94 | - @Override | |
| 95 | - public String toString() { | |
| 96 | - return "ChatResponse [metadata=" + chatResponseMetadata + ", generations=" + generations + "]"; | |
| 97 | - } | |
| 98 | - | |
| 99 | - @Override | |
| 100 | - public boolean equals(Object o) { | |
| 101 | - if (this == o) | |
| 102 | - return true; | |
| 103 | -// if (!(o instanceof ChatResponse that)) | |
| 104 | -// return false; | |
| 105 | - if (!(o instanceof ChatResponse)) { | |
| 106 | - return false; | |
| 107 | - } | |
| 108 | - ChatResponse that = (ChatResponse) o; | |
| 109 | - return Objects.equals(chatResponseMetadata, that.chatResponseMetadata) | |
| 110 | - && Objects.equals(generations, that.generations); | |
| 111 | - } | |
| 112 | - | |
| 113 | - @Override | |
| 114 | - public int hashCode() { | |
| 115 | - return Objects.hash(chatResponseMetadata, generations); | |
| 116 | - } | |
| 117 | - | |
| 118 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/Generation.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat; | |
| 18 | - | |
| 19 | -import org.springframework.ai.chat.messages.AssistantMessage; | |
| 20 | -import org.springframework.ai.chat.metadata.ChatGenerationMetadata; | |
| 21 | -import org.springframework.ai.model.ModelResult; | |
| 22 | -import org.springframework.lang.Nullable; | |
| 23 | - | |
| 24 | -import java.util.Map; | |
| 25 | -import java.util.Objects; | |
| 26 | - | |
| 27 | -/** | |
| 28 | - * 表示AI返回的响应。 | |
| 29 | - * | |
| 30 | - * Represents a response returned by the AI. | |
| 31 | - */ | |
| 32 | -public class Generation implements ModelResult<AssistantMessage> { | |
| 33 | - | |
| 34 | - private AssistantMessage assistantMessage; | |
| 35 | - | |
| 36 | - private ChatGenerationMetadata chatGenerationMetadata; | |
| 37 | - | |
| 38 | - public Generation(String text) { | |
| 39 | - this.assistantMessage = new AssistantMessage(text); | |
| 40 | - } | |
| 41 | - | |
| 42 | - public Generation(String text, Map<String, Object> properties) { | |
| 43 | - this.assistantMessage = new AssistantMessage(text, properties); | |
| 44 | - } | |
| 45 | - | |
| 46 | - @Override | |
| 47 | - public AssistantMessage getOutput() { | |
| 48 | - return this.assistantMessage; | |
| 49 | - } | |
| 50 | - | |
| 51 | - @Override | |
| 52 | - public ChatGenerationMetadata getMetadata() { | |
| 53 | - ChatGenerationMetadata chatGenerationMetadata = this.chatGenerationMetadata; | |
| 54 | - return chatGenerationMetadata != null ? chatGenerationMetadata : ChatGenerationMetadata.NULL; | |
| 55 | - } | |
| 56 | - | |
| 57 | - public Generation withGenerationMetadata(@Nullable ChatGenerationMetadata chatGenerationMetadata) { | |
| 58 | - this.chatGenerationMetadata = chatGenerationMetadata; | |
| 59 | - return this; | |
| 60 | - } | |
| 61 | - | |
| 62 | - @Override | |
| 63 | - public boolean equals(Object o) { | |
| 64 | - if (this == o) | |
| 65 | - return true; | |
| 66 | - | |
| 67 | - if (!(o instanceof Generation)) { | |
| 68 | - return false; | |
| 69 | - } | |
| 70 | - Generation that = (Generation) o; | |
| 71 | - return Objects.equals(assistantMessage, that.assistantMessage) | |
| 72 | - && Objects.equals(chatGenerationMetadata, that.chatGenerationMetadata); | |
| 73 | - } | |
| 74 | - | |
| 75 | - @Override | |
| 76 | - public int hashCode() { | |
| 77 | - return Objects.hash(assistantMessage, chatGenerationMetadata); | |
| 78 | - } | |
| 79 | - | |
| 80 | - @Override | |
| 81 | - public String toString() { | |
| 82 | - return "Generation{" + "assistantMessage=" + assistantMessage + ", chatGenerationMetadata=" | |
| 83 | - + chatGenerationMetadata + '}'; | |
| 84 | - } | |
| 85 | - | |
| 86 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/StreamingChatClient.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat; | |
| 18 | - | |
| 19 | -import org.springframework.ai.chat.prompt.Prompt; | |
| 20 | -import org.springframework.ai.model.StreamingModelClient; | |
| 21 | -import reactor.core.publisher.Flux; | |
| 22 | - | |
| 23 | -@FunctionalInterface | |
| 24 | -public interface StreamingChatClient extends StreamingModelClient<Prompt, ChatResponse> { | |
| 25 | - | |
| 26 | - @Override | |
| 27 | - Flux<ChatResponse> stream(Prompt prompt); | |
| 28 | - | |
| 29 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/messages/AbstractMessage.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.messages; | |
| 18 | - | |
| 19 | -import org.springframework.core.io.Resource; | |
| 20 | -import org.springframework.util.Assert; | |
| 21 | -import org.springframework.util.StreamUtils; | |
| 22 | - | |
| 23 | -import java.io.IOException; | |
| 24 | -import java.io.InputStream; | |
| 25 | -import java.nio.charset.Charset; | |
| 26 | -import java.util.ArrayList; | |
| 27 | -import java.util.Collections; | |
| 28 | -import java.util.List; | |
| 29 | -import java.util.Map; | |
| 30 | - | |
| 31 | -public abstract class AbstractMessage implements Message { | |
| 32 | - | |
| 33 | - protected final MessageType messageType; | |
| 34 | - | |
| 35 | - protected final String textContent; | |
| 36 | - | |
| 37 | - protected final List<MediaData> mediaData; | |
| 38 | - | |
| 39 | - /** | |
| 40 | - * Additional options for the message to influence the response, not a generative map. | |
| 41 | - */ | |
| 42 | - protected final Map<String, Object> properties; | |
| 43 | - | |
| 44 | - protected AbstractMessage(MessageType messageType, String content) { | |
| 45 | - this(messageType, content, Map.of()); | |
| 46 | - } | |
| 47 | - | |
| 48 | - protected AbstractMessage(MessageType messageType, String content, Map<String, Object> messageProperties) { | |
| 49 | - Assert.notNull(messageType, "Message type must not be null"); | |
| 50 | - // Assert.notNull(content, "Content must not be null"); | |
| 51 | - this.messageType = messageType; | |
| 52 | - this.textContent = content; | |
| 53 | - this.mediaData = new ArrayList<>(); | |
| 54 | - this.properties = messageProperties; | |
| 55 | - } | |
| 56 | - | |
| 57 | - protected AbstractMessage(MessageType messageType, String textContent, List<MediaData> mediaData) { | |
| 58 | - this(messageType, textContent, mediaData, Map.of()); | |
| 59 | - } | |
| 60 | - | |
| 61 | - protected AbstractMessage(MessageType messageType, String textContent, List<MediaData> mediaData, | |
| 62 | - Map<String, Object> messageProperties) { | |
| 63 | - | |
| 64 | - Assert.notNull(messageType, "Message type must not be null"); | |
| 65 | - Assert.notNull(textContent, "Content must not be null"); | |
| 66 | - Assert.notNull(mediaData, "media data must not be null"); | |
| 67 | - | |
| 68 | - this.messageType = messageType; | |
| 69 | - this.textContent = textContent; | |
| 70 | - this.mediaData = new ArrayList<>(mediaData); | |
| 71 | - this.properties = messageProperties; | |
| 72 | - } | |
| 73 | - | |
| 74 | - protected AbstractMessage(MessageType messageType, Resource resource) { | |
| 75 | - this(messageType, resource, Collections.emptyMap()); | |
| 76 | - } | |
| 77 | - | |
| 78 | - @SuppressWarnings("null") | |
| 79 | - protected AbstractMessage(MessageType messageType, Resource resource, Map<String, Object> messageProperties) { | |
| 80 | - Assert.notNull(messageType, "Message type must not be null"); | |
| 81 | - Assert.notNull(resource, "Resource must not be null"); | |
| 82 | - | |
| 83 | - this.messageType = messageType; | |
| 84 | - this.properties = messageProperties; | |
| 85 | - this.mediaData = new ArrayList<>(); | |
| 86 | - | |
| 87 | - try (InputStream inputStream = resource.getInputStream()) { | |
| 88 | - this.textContent = StreamUtils.copyToString(inputStream, Charset.defaultCharset()); | |
| 89 | - } | |
| 90 | - catch (IOException ex) { | |
| 91 | - throw new RuntimeException("Failed to read resource", ex); | |
| 92 | - } | |
| 93 | - } | |
| 94 | - | |
| 95 | - @Override | |
| 96 | - public String getContent() { | |
| 97 | - return this.textContent; | |
| 98 | - } | |
| 99 | - | |
| 100 | - @Override | |
| 101 | - public List<MediaData> getMediaData() { | |
| 102 | - return this.mediaData; | |
| 103 | - } | |
| 104 | - | |
| 105 | - @Override | |
| 106 | - public Map<String, Object> getProperties() { | |
| 107 | - return this.properties; | |
| 108 | - } | |
| 109 | - | |
| 110 | - @Override | |
| 111 | - public MessageType getMessageType() { | |
| 112 | - return this.messageType; | |
| 113 | - } | |
| 114 | - | |
| 115 | - @Override | |
| 116 | - public int hashCode() { | |
| 117 | - final int prime = 31; | |
| 118 | - int result = 1; | |
| 119 | - result = prime * result + ((mediaData == null) ? 0 : mediaData.hashCode()); | |
| 120 | - result = prime * result + ((properties == null) ? 0 : properties.hashCode()); | |
| 121 | - result = prime * result + ((messageType == null) ? 0 : messageType.hashCode()); | |
| 122 | - return result; | |
| 123 | - } | |
| 124 | - | |
| 125 | - @Override | |
| 126 | - public boolean equals(Object obj) { | |
| 127 | - if (this == obj) | |
| 128 | - return true; | |
| 129 | - if (obj == null) | |
| 130 | - return false; | |
| 131 | - if (getClass() != obj.getClass()) | |
| 132 | - return false; | |
| 133 | - AbstractMessage other = (AbstractMessage) obj; | |
| 134 | - if (mediaData == null) { | |
| 135 | - if (other.mediaData != null) | |
| 136 | - return false; | |
| 137 | - } | |
| 138 | - else if (!mediaData.equals(other.mediaData)) | |
| 139 | - return false; | |
| 140 | - if (properties == null) { | |
| 141 | - if (other.properties != null) | |
| 142 | - return false; | |
| 143 | - } | |
| 144 | - else if (!properties.equals(other.properties)) | |
| 145 | - return false; | |
| 146 | - if (messageType != other.messageType) | |
| 147 | - return false; | |
| 148 | - return true; | |
| 149 | - } | |
| 150 | - | |
| 151 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/messages/AssistantMessage.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.messages; | |
| 18 | - | |
| 19 | -import java.util.Map; | |
| 20 | - | |
| 21 | -/** | |
| 22 | - * 让生成人员知道内容是作为对用户的响应生成的。 | |
| 23 | - * 此角色指示生成者先前在会话中生成的消息。 | |
| 24 | - * 通过包括该系列中的辅助消息,您可以为生成的关于提供上下文之前在谈话中的交流。 | |
| 25 | - * | |
| 26 | - * Lets the generative know the content was generated as a response to the user. This role | |
| 27 | - * indicates messages that the generative has previously generated in the conversation. By | |
| 28 | - * including assistant messages in the series, you provide context to the generative about | |
| 29 | - * prior exchanges in the conversation. | |
| 30 | - */ | |
| 31 | -public class AssistantMessage extends AbstractMessage { | |
| 32 | - | |
| 33 | - public AssistantMessage(String content) { | |
| 34 | - super(MessageType.ASSISTANT, content); | |
| 35 | - } | |
| 36 | - | |
| 37 | - public AssistantMessage(String content, Map<String, Object> properties) { | |
| 38 | - super(MessageType.ASSISTANT, content, properties); | |
| 39 | - } | |
| 40 | - | |
| 41 | - @Override | |
| 42 | - public String toString() { | |
| 43 | - return "AssistantMessage{" + "content='" + getContent() + '\'' + ", properties=" + properties + ", messageType=" | |
| 44 | - + messageType + '}'; | |
| 45 | - } | |
| 46 | - | |
| 47 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/messages/ChatMessage.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.messages; | |
| 18 | - | |
| 19 | -import java.util.Map; | |
| 20 | - | |
| 21 | -public class ChatMessage extends AbstractMessage { | |
| 22 | - | |
| 23 | - public ChatMessage(String role, String content) { | |
| 24 | - super(MessageType.valueOf(role), content); | |
| 25 | - } | |
| 26 | - | |
| 27 | - public ChatMessage(String role, String content, Map<String, Object> properties) { | |
| 28 | - super(MessageType.valueOf(role), content, properties); | |
| 29 | - } | |
| 30 | - | |
| 31 | - public ChatMessage(MessageType messageType, String content) { | |
| 32 | - super(messageType, content); | |
| 33 | - } | |
| 34 | - | |
| 35 | - public ChatMessage(MessageType messageType, String content, Map<String, Object> properties) { | |
| 36 | - super(messageType, content, properties); | |
| 37 | - } | |
| 38 | - | |
| 39 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/messages/FunctionMessage.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.messages; | |
| 18 | - | |
| 19 | -import java.util.Map; | |
| 20 | - | |
| 21 | -public class FunctionMessage extends AbstractMessage { | |
| 22 | - | |
| 23 | - public FunctionMessage(String content) { | |
| 24 | - super(MessageType.SYSTEM, content); | |
| 25 | - } | |
| 26 | - | |
| 27 | - public FunctionMessage(String content, Map<String, Object> properties) { | |
| 28 | - super(MessageType.SYSTEM, content, properties); | |
| 29 | - } | |
| 30 | - | |
| 31 | - @Override | |
| 32 | - public String toString() { | |
| 33 | - return "FunctionMessage{" + "content='" + getContent() + '\'' + ", properties=" + properties + ", messageType=" | |
| 34 | - + messageType + '}'; | |
| 35 | - } | |
| 36 | - | |
| 37 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/messages/MediaData.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.messages; | |
| 18 | - | |
| 19 | -import org.springframework.util.Assert; | |
| 20 | -import org.springframework.util.MimeType; | |
| 21 | - | |
| 22 | -/** | |
| 23 | - * @author Christian Tzolov | |
| 24 | - */ | |
| 25 | -public class MediaData { | |
| 26 | - | |
| 27 | - private final MimeType mimeType; | |
| 28 | - | |
| 29 | - private final Object data; | |
| 30 | - | |
| 31 | - public MediaData(MimeType mimeType, Object data) { | |
| 32 | - Assert.notNull(mimeType, "MimeType must not be null"); | |
| 33 | - // Assert.notNull(data, "Data must not be null"); | |
| 34 | - this.mimeType = mimeType; | |
| 35 | - this.data = data; | |
| 36 | - } | |
| 37 | - | |
| 38 | - public MimeType getMimeType() { | |
| 39 | - return this.mimeType; | |
| 40 | - } | |
| 41 | - | |
| 42 | - public Object getData() { | |
| 43 | - return this.data; | |
| 44 | - } | |
| 45 | - | |
| 46 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/messages/Message.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.messages; | |
| 18 | - | |
| 19 | -import java.util.List; | |
| 20 | -import java.util.Map; | |
| 21 | - | |
| 22 | -public interface Message { | |
| 23 | - | |
| 24 | - String getContent(); | |
| 25 | - | |
| 26 | - List<MediaData> getMediaData(); | |
| 27 | - | |
| 28 | - Map<String, Object> getProperties(); | |
| 29 | - | |
| 30 | - MessageType getMessageType(); | |
| 31 | - | |
| 32 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/messages/MessageType.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | -package org.springframework.ai.chat.messages; | |
| 17 | - | |
| 18 | -public enum MessageType { | |
| 19 | - | |
| 20 | - // 用户消息 | |
| 21 | - USER("user"), | |
| 22 | - | |
| 23 | - // 之前会话的消息 | |
| 24 | - ASSISTANT("assistant"), | |
| 25 | - | |
| 26 | - // 根据注释说明:您可以使用系统消息来指示具有生成性,表现得像某个角色或以特定的方式提供答案总体安排 | |
| 27 | - // 简单理解:在对话前,发送一条具有角色的信息让模型理解(如:你现在是一个10年拍摄经验的导演,拥有丰富的经验。 这样你就可以去问他,怎么拍一个短视频可以在抖音上火) | |
| 28 | - SYSTEM("system"), | |
| 29 | - | |
| 30 | - // 函数?根据引用现在不支持,会抛出一个异常 ---> throw new IllegalArgumentException("Tool execution results are not supported for Bedrock models"); | |
| 31 | - FUNCTION("function"); | |
| 32 | - | |
| 33 | - private final String value; | |
| 34 | - | |
| 35 | - MessageType(String value) { | |
| 36 | - this.value = value; | |
| 37 | - } | |
| 38 | - | |
| 39 | - public String getValue() { | |
| 40 | - return value; | |
| 41 | - } | |
| 42 | - | |
| 43 | - public static MessageType fromValue(String value) { | |
| 44 | - for (MessageType messageType : MessageType.values()) { | |
| 45 | - if (messageType.getValue().equals(value)) { | |
| 46 | - return messageType; | |
| 47 | - } | |
| 48 | - } | |
| 49 | - throw new IllegalArgumentException("Invalid MessageType value: " + value); | |
| 50 | - } | |
| 51 | - | |
| 52 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/messages/SystemMessage.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.messages; | |
| 18 | - | |
| 19 | -import org.springframework.core.io.Resource; | |
| 20 | - | |
| 21 | -/** | |
| 22 | - * 作为输入传递的“system”类型的消息。系统消息给出高级别对话说明。 | |
| 23 | - * 此角色通常提供高级说明对话。 | |
| 24 | - * 例如,您可以使用系统消息来指示具有生成性,表现得像某个角色或以特定的方式提供答案总体安排 | |
| 25 | - * | |
| 26 | - * A message of the type 'system' passed as input. The system message gives high level | |
| 27 | - * instructions for the conversation. This role typically provides high-level instructions | |
| 28 | - * for the conversation. For example, you might use a system message to instruct the | |
| 29 | - * generative to behave like a certain character or to provide answers in a specific | |
| 30 | - * format. | |
| 31 | - */ | |
| 32 | -public class SystemMessage extends AbstractMessage { | |
| 33 | - | |
| 34 | - public SystemMessage(String content) { | |
| 35 | - super(MessageType.SYSTEM, content); | |
| 36 | - } | |
| 37 | - | |
| 38 | - public SystemMessage(Resource resource) { | |
| 39 | - super(MessageType.SYSTEM, resource); | |
| 40 | - } | |
| 41 | - | |
| 42 | - @Override | |
| 43 | - public String toString() { | |
| 44 | - return "SystemMessage{" + "content='" + getContent() + '\'' + ", properties=" + properties + ", messageType=" | |
| 45 | - + messageType + '}'; | |
| 46 | - } | |
| 47 | - | |
| 48 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/messages/UserMessage.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.messages; | |
| 18 | - | |
| 19 | -import org.springframework.core.io.Resource; | |
| 20 | - | |
| 21 | -import java.util.List; | |
| 22 | - | |
| 23 | -/** | |
| 24 | - * 作为输入传递的“user”类型的消息具有用户角色的消息来自最终用户或开发者。 | |
| 25 | - * 它们表示问题、提示或您想要的任何输入产生反应的。 | |
| 26 | - * | |
| 27 | - * A message of the type 'user' passed as input Messages with the user role are from the | |
| 28 | - * end-user or developer. They represent questions, prompts, or any input that you want | |
| 29 | - * the generative to respond to. | |
| 30 | - */ | |
| 31 | -public class UserMessage extends AbstractMessage { | |
| 32 | - | |
| 33 | - public UserMessage(String message) { | |
| 34 | - super(MessageType.USER, message); | |
| 35 | - } | |
| 36 | - | |
| 37 | - public UserMessage(Resource resource) { | |
| 38 | - super(MessageType.USER, resource); | |
| 39 | - } | |
| 40 | - | |
| 41 | - public UserMessage(String textContent, List<MediaData> mediaDataList) { | |
| 42 | - super(MessageType.USER, textContent, mediaDataList); | |
| 43 | - } | |
| 44 | - | |
| 45 | - @Override | |
| 46 | - public String toString() { | |
| 47 | - return "UserMessage{" + "content='" + getContent() + '\'' + ", properties=" + properties + ", messageType=" | |
| 48 | - + messageType + '}'; | |
| 49 | - } | |
| 50 | - | |
| 51 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/metadata/ChatGenerationMetadata.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.metadata; | |
| 18 | - | |
| 19 | -import org.springframework.ai.model.ResultMetadata; | |
| 20 | -import org.springframework.lang.Nullable; | |
| 21 | - | |
| 22 | -/** | |
| 23 | - * Abstract Data Type (ADT) encapsulating information on the completion choices in the AI | |
| 24 | - * response. | |
| 25 | - * | |
| 26 | - * @author John Blum | |
| 27 | - * @since 0.7.0 | |
| 28 | - */ | |
| 29 | -public interface ChatGenerationMetadata extends ResultMetadata { | |
| 30 | - | |
| 31 | - ChatGenerationMetadata NULL = ChatGenerationMetadata.from(null, null); | |
| 32 | - | |
| 33 | - /** | |
| 34 | - * Factory method used to construct a new {@link ChatGenerationMetadata} from the | |
| 35 | - * given {@link String finish reason} and content filter metadata. | |
| 36 | - * @param finishReason {@link String} contain the reason for the choice completion. | |
| 37 | - * @param contentFilterMetadata underlying AI provider metadata for filtering applied | |
| 38 | - * to generation content. | |
| 39 | - * @return a new {@link ChatGenerationMetadata} from the given {@link String finish | |
| 40 | - * reason} and content filter metadata. | |
| 41 | - */ | |
| 42 | - static ChatGenerationMetadata from(String finishReason, Object contentFilterMetadata) { | |
| 43 | - return new ChatGenerationMetadata() { | |
| 44 | - | |
| 45 | - @Override | |
| 46 | - @SuppressWarnings("unchecked") | |
| 47 | - public <T> T getContentFilterMetadata() { | |
| 48 | - return (T) contentFilterMetadata; | |
| 49 | - } | |
| 50 | - | |
| 51 | - @Override | |
| 52 | - public String getFinishReason() { | |
| 53 | - return finishReason; | |
| 54 | - } | |
| 55 | - }; | |
| 56 | - } | |
| 57 | - | |
| 58 | - /** | |
| 59 | - * Returns the underlying AI provider metadata for filtering applied to generation | |
| 60 | - * content. | |
| 61 | - * @param <T> {@link Class Type} used to cast the filtered content metadata into the | |
| 62 | - * AI provider-specific type. | |
| 63 | - * @return the underlying AI provider metadata for filtering applied to generation | |
| 64 | - * content. | |
| 65 | - */ | |
| 66 | - @Nullable | |
| 67 | - <T> T getContentFilterMetadata(); | |
| 68 | - | |
| 69 | - /** | |
| 70 | - * Get the {@link String reason} this choice completed for the generation. | |
| 71 | - * @return the {@link String reason} this choice completed for the generation. | |
| 72 | - */ | |
| 73 | - String getFinishReason(); | |
| 74 | - | |
| 75 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.metadata; | |
| 18 | - | |
| 19 | - | |
| 20 | -import org.springframework.ai.model.ResponseMetadata; | |
| 21 | - | |
| 22 | -/** | |
| 23 | - * Abstract Data Type (ADT) modeling common AI provider metadata returned in an AI | |
| 24 | - * response. | |
| 25 | - * | |
| 26 | - * 抽象数据类型(ADT)建模AI响应中返回的常见AI提供者元数据。 | |
| 27 | - * | |
| 28 | - * @author John Blum | |
| 29 | - * @since 0.7.0 | |
| 30 | - */ | |
| 31 | -public interface ChatResponseMetadata extends ResponseMetadata { | |
| 32 | - | |
| 33 | - ChatResponseMetadata NULL = new ChatResponseMetadata() { | |
| 34 | - }; | |
| 35 | - | |
| 36 | - /** | |
| 37 | - * Returns AI provider specific metadata on rate limits. | |
| 38 | - * @return AI provider specific metadata on rate limits. | |
| 39 | - * @see RateLimit | |
| 40 | - */ | |
| 41 | - default RateLimit getRateLimit() { | |
| 42 | - return new EmptyRateLimit(); | |
| 43 | - } | |
| 44 | - | |
| 45 | - /** | |
| 46 | - * Returns AI provider specific metadata on API usage. | |
| 47 | - * @return AI provider specific metadata on API usage. | |
| 48 | - * @see Usage | |
| 49 | - */ | |
| 50 | - default Usage getUsage() { | |
| 51 | - return new EmptyUsage(); | |
| 52 | - } | |
| 53 | - | |
| 54 | - default PromptMetadata getPromptMetadata() { | |
| 55 | - return PromptMetadata.empty(); | |
| 56 | - } | |
| 57 | - | |
| 58 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/metadata/EmptyRateLimit.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.metadata; | |
| 18 | - | |
| 19 | -import java.time.Duration; | |
| 20 | - | |
| 21 | -/** | |
| 22 | - * A RateLimit implementation that returns zero for all property getters | |
| 23 | - * | |
| 24 | - * @author John Blum | |
| 25 | - * @since 0.7.0 | |
| 26 | - */ | |
| 27 | -public class EmptyRateLimit implements RateLimit { | |
| 28 | - | |
| 29 | - @Override | |
| 30 | - public Long getRequestsLimit() { | |
| 31 | - return 0L; | |
| 32 | - } | |
| 33 | - | |
| 34 | - @Override | |
| 35 | - public Long getRequestsRemaining() { | |
| 36 | - return 0L; | |
| 37 | - } | |
| 38 | - | |
| 39 | - @Override | |
| 40 | - public Duration getRequestsReset() { | |
| 41 | - return Duration.ZERO; | |
| 42 | - } | |
| 43 | - | |
| 44 | - @Override | |
| 45 | - public Long getTokensLimit() { | |
| 46 | - return 0L; | |
| 47 | - } | |
| 48 | - | |
| 49 | - @Override | |
| 50 | - public Long getTokensRemaining() { | |
| 51 | - return 0L; | |
| 52 | - } | |
| 53 | - | |
| 54 | - @Override | |
| 55 | - public Duration getTokensReset() { | |
| 56 | - return Duration.ZERO; | |
| 57 | - } | |
| 58 | - | |
| 59 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/metadata/EmptyUsage.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.metadata; | |
| 18 | - | |
| 19 | -/** | |
| 20 | - * A EmpytUsage implementation that returns zero for all property getters | |
| 21 | - * | |
| 22 | - * @author John Blum | |
| 23 | - * @since 0.7.0 | |
| 24 | - */ | |
| 25 | -public class EmptyUsage implements Usage { | |
| 26 | - | |
| 27 | - @Override | |
| 28 | - public Long getPromptTokens() { | |
| 29 | - return 0L; | |
| 30 | - } | |
| 31 | - | |
| 32 | - @Override | |
| 33 | - public Long getGenerationTokens() { | |
| 34 | - return 0L; | |
| 35 | - } | |
| 36 | - | |
| 37 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/metadata/PromptMetadata.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | -package org.springframework.ai.chat.metadata; | |
| 17 | - | |
| 18 | -import org.springframework.util.Assert; | |
| 19 | - | |
| 20 | -import java.util.Arrays; | |
| 21 | -import java.util.Optional; | |
| 22 | -import java.util.stream.StreamSupport; | |
| 23 | - | |
| 24 | -/** | |
| 25 | - * Abstract Data Type (ADT) modeling metadata gathered by the AI during request | |
| 26 | - * processing. | |
| 27 | - * | |
| 28 | - * @author John Blum | |
| 29 | - * @since 0.7.0 | |
| 30 | - */ | |
| 31 | -@FunctionalInterface | |
| 32 | -public interface PromptMetadata extends Iterable<PromptMetadata.PromptFilterMetadata> { | |
| 33 | - | |
| 34 | - /** | |
| 35 | - * Factory method used to create empty {@link PromptMetadata} when the information is | |
| 36 | - * not supplied by the AI provider. | |
| 37 | - * @return empty {@link PromptMetadata}. | |
| 38 | - */ | |
| 39 | - static PromptMetadata empty() { | |
| 40 | - return of(); | |
| 41 | - } | |
| 42 | - | |
| 43 | - /** | |
| 44 | - * Factory method used to create a new {@link PromptMetadata} composed of an array of | |
| 45 | - * {@link PromptFilterMetadata}. | |
| 46 | - * @param array array of {@link PromptFilterMetadata} used to compose the | |
| 47 | - * {@link PromptMetadata}. | |
| 48 | - * @return a new {@link PromptMetadata} composed of an array of | |
| 49 | - * {@link PromptFilterMetadata}. | |
| 50 | - */ | |
| 51 | - static <T> PromptMetadata of(PromptFilterMetadata... array) { | |
| 52 | - return of(Arrays.asList(array)); | |
| 53 | - } | |
| 54 | - | |
| 55 | - /** | |
| 56 | - * Factory method used to create a new {@link PromptMetadata} composed of an | |
| 57 | - * {@link Iterable} of {@link PromptFilterMetadata}. | |
| 58 | - * @param iterable {@link Iterable} of {@link PromptFilterMetadata} used to compose | |
| 59 | - * the {@link PromptMetadata}. | |
| 60 | - * @return a new {@link PromptMetadata} composed of an {@link Iterable} of | |
| 61 | - * {@link PromptFilterMetadata}. | |
| 62 | - */ | |
| 63 | - static PromptMetadata of(Iterable<PromptFilterMetadata> iterable) { | |
| 64 | - Assert.notNull(iterable, "An Iterable of PromptFilterMetadata must not be null"); | |
| 65 | - return iterable::iterator; | |
| 66 | - } | |
| 67 | - | |
| 68 | - /** | |
| 69 | - * Returns an {@link Optional} {@link PromptFilterMetadata} at the given index. | |
| 70 | - * @param promptIndex index of the {@link PromptFilterMetadata} contained in this | |
| 71 | - * {@link PromptMetadata}. | |
| 72 | - * @return {@link Optional} {@link PromptFilterMetadata} at the given index. | |
| 73 | - * @throws IllegalArgumentException if the prompt index is less than 0. | |
| 74 | - */ | |
| 75 | - default Optional<PromptFilterMetadata> findByPromptIndex(int promptIndex) { | |
| 76 | - | |
| 77 | - Assert.isTrue(promptIndex > -1, "Prompt index [%d] must be greater than equal to 0".formatted(promptIndex)); | |
| 78 | - | |
| 79 | - return StreamSupport.stream(this.spliterator(), false) | |
| 80 | - .filter(promptFilterMetadata -> promptFilterMetadata.getPromptIndex() == promptIndex) | |
| 81 | - .findFirst(); | |
| 82 | - } | |
| 83 | - | |
| 84 | - /** | |
| 85 | - * Abstract Data Type (ADT) modeling filter metadata for all prompts sent during an AI | |
| 86 | - * request. | |
| 87 | - */ | |
| 88 | - interface PromptFilterMetadata { | |
| 89 | - | |
| 90 | - /** | |
| 91 | - * Factory method used to construct a new {@link PromptFilterMetadata} with the | |
| 92 | - * given prompt index and content filter metadata. | |
| 93 | - * @param promptIndex index of the prompt filter metadata contained in the AI | |
| 94 | - * response. | |
| 95 | - * @param contentFilterMetadata underlying AI provider metadata for filtering | |
| 96 | - * applied to prompt content. | |
| 97 | - * @return a new instance of {@link PromptFilterMetadata} with the given prompt | |
| 98 | - * index and content filter metadata. | |
| 99 | - */ | |
| 100 | - static PromptFilterMetadata from(int promptIndex, Object contentFilterMetadata) { | |
| 101 | - | |
| 102 | - return new PromptFilterMetadata() { | |
| 103 | - | |
| 104 | - @Override | |
| 105 | - public int getPromptIndex() { | |
| 106 | - return promptIndex; | |
| 107 | - } | |
| 108 | - | |
| 109 | - @Override | |
| 110 | - @SuppressWarnings("unchecked") | |
| 111 | - public <T> T getContentFilterMetadata() { | |
| 112 | - return (T) contentFilterMetadata; | |
| 113 | - } | |
| 114 | - }; | |
| 115 | - } | |
| 116 | - | |
| 117 | - /** | |
| 118 | - * Index of the prompt filter metadata contained in the AI response. | |
| 119 | - * @return an {@link Integer index} fo the prompt filter metadata contained in the | |
| 120 | - * AI response. | |
| 121 | - */ | |
| 122 | - int getPromptIndex(); | |
| 123 | - | |
| 124 | - /** | |
| 125 | - * Returns the underlying AI provider metadata for filtering applied to prompt | |
| 126 | - * content. | |
| 127 | - * @param <T> {@link Class Type} used to cast the filtered content metadata into | |
| 128 | - * the AI provider-specific type. | |
| 129 | - * @return the underlying AI provider metadata for filtering applied to prompt | |
| 130 | - * content. | |
| 131 | - */ | |
| 132 | - <T> T getContentFilterMetadata(); | |
| 133 | - | |
| 134 | - } | |
| 135 | - | |
| 136 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/metadata/RateLimit.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.metadata; | |
| 18 | - | |
| 19 | -import java.time.Duration; | |
| 20 | - | |
| 21 | -/** | |
| 22 | - * Abstract Data Type (ADT) encapsulating metadata from an AI provider's API rate limits | |
| 23 | - * granted to the API key in use and the API key's current balance. | |
| 24 | - * | |
| 25 | - * @author John Blum | |
| 26 | - * @since 0.7.0 | |
| 27 | - */ | |
| 28 | -public interface RateLimit { | |
| 29 | - | |
| 30 | - /** | |
| 31 | - * Returns the maximum number of requests that are permitted before exhausting the | |
| 32 | - * rate limit. | |
| 33 | - * @return an {@link Long} with the maximum number of requests that are permitted | |
| 34 | - * before exhausting the rate limit. | |
| 35 | - * @see #getRequestsRemaining() | |
| 36 | - */ | |
| 37 | - Long getRequestsLimit(); | |
| 38 | - | |
| 39 | - /** | |
| 40 | - * Returns the remaining number of requests that are permitted before exhausting the | |
| 41 | - * {@link #getRequestsLimit() rate limit}. | |
| 42 | - * @return an {@link Long} with the remaining number of requests that are permitted | |
| 43 | - * before exhausting the {@link #getRequestsLimit() rate limit}. | |
| 44 | - * @see #getRequestsLimit() | |
| 45 | - */ | |
| 46 | - Long getRequestsRemaining(); | |
| 47 | - | |
| 48 | - /** | |
| 49 | - * Returns the {@link Duration time} until the rate limit (based on requests) resets | |
| 50 | - * to its {@link #getRequestsLimit() initial state}. | |
| 51 | - * @return a {@link Duration} representing the time until the rate limit (based on | |
| 52 | - * requests) resets to its {@link #getRequestsLimit() initial state}. | |
| 53 | - * @see #getRequestsLimit() | |
| 54 | - */ | |
| 55 | - Duration getRequestsReset(); | |
| 56 | - | |
| 57 | - /** | |
| 58 | - * Returns the maximum number of tokens that are permitted before exhausting the rate | |
| 59 | - * limit. | |
| 60 | - * @return an {@link Long} with the maximum number of tokens that are permitted before | |
| 61 | - * exhausting the rate limit. | |
| 62 | - * @see #getTokensRemaining() | |
| 63 | - */ | |
| 64 | - Long getTokensLimit(); | |
| 65 | - | |
| 66 | - /** | |
| 67 | - * Returns the remaining number of tokens that are permitted before exhausting the | |
| 68 | - * {@link #getTokensLimit() rate limit}. | |
| 69 | - * @return an {@link Long} with the remaining number of tokens that are permitted | |
| 70 | - * before exhausting the {@link #getTokensLimit() rate limit}. | |
| 71 | - * @see #getTokensLimit() | |
| 72 | - */ | |
| 73 | - Long getTokensRemaining(); | |
| 74 | - | |
| 75 | - /** | |
| 76 | - * Returns the {@link Duration time} until the rate limit (based on tokens) resets to | |
| 77 | - * its {@link #getTokensLimit() initial state}. | |
| 78 | - * @return a {@link Duration} with the time until the rate limit (based on tokens) | |
| 79 | - * resets to its {@link #getTokensLimit() initial state}. | |
| 80 | - * @see #getTokensLimit() | |
| 81 | - */ | |
| 82 | - Duration getTokensReset(); | |
| 83 | - | |
| 84 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/metadata/Usage.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.metadata; | |
| 18 | - | |
| 19 | -/** | |
| 20 | - * 抽象数据类型(ADT)封装关于人工智能提供商API使用的元数据根据AI请求。 | |
| 21 | - * | |
| 22 | - * Abstract Data Type (ADT) encapsulating metadata on the usage of an AI provider's API | |
| 23 | - * per AI request. | |
| 24 | - * | |
| 25 | - * @author John Blum | |
| 26 | - * @since 0.7.0 | |
| 27 | - */ | |
| 28 | -public interface Usage { | |
| 29 | - | |
| 30 | - /** | |
| 31 | - * 返回AI请求的{@literal prompt}中使用的令牌数。 | |
| 32 | - * @返回一个{@link Long},其中包含在的{@literal提示符}中使用的令牌数AI请求。 | |
| 33 | - * | |
| 34 | - * Returns the number of tokens used in the {@literal prompt} of the AI request. | |
| 35 | - * @return an {@link Long} with the number of tokens used in the {@literal prompt} of | |
| 36 | - * the AI request. | |
| 37 | - * @see #getGenerationTokens() | |
| 38 | - */ | |
| 39 | - Long getPromptTokens(); | |
| 40 | - | |
| 41 | - /** | |
| 42 | - * Returns the number of tokens returned in the {@literal generation (aka completion)} | |
| 43 | - * of the AI's response. | |
| 44 | - * @return an {@link Long} with the number of tokens returned in the | |
| 45 | - * {@literal generation (aka completion)} of the AI's response. | |
| 46 | - * @see #getPromptTokens() | |
| 47 | - */ | |
| 48 | - Long getGenerationTokens(); | |
| 49 | - | |
| 50 | - /** | |
| 51 | - * Return the total number of tokens from both the {@literal prompt} of an AI request | |
| 52 | - * and {@literal generation} of the AI's response. | |
| 53 | - * @return the total number of tokens from both the {@literal prompt} of an AI request | |
| 54 | - * and {@literal generation} of the AI's response. | |
| 55 | - * @see #getPromptTokens() | |
| 56 | - * @see #getGenerationTokens() | |
| 57 | - */ | |
| 58 | - default Long getTotalTokens() { | |
| 59 | - Long promptTokens = getPromptTokens(); | |
| 60 | - promptTokens = promptTokens != null ? promptTokens : 0; | |
| 61 | - Long completionTokens = getGenerationTokens(); | |
| 62 | - completionTokens = completionTokens != null ? completionTokens : 0; | |
| 63 | - return promptTokens + completionTokens; | |
| 64 | - } | |
| 65 | - | |
| 66 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/package-info.java deleted
| 1 | -/** | |
| 2 | - * The org.sf.ai.chat package represents the bounded context for the Chat Model within the | |
| 3 | - * AI generative model domain. This package extends the core domain defined in | |
| 4 | - * org.sf.ai.generative, providing implementations specific to chat-based generative AI | |
| 5 | - * interactions. | |
| 6 | - * | |
| 7 | - * In line with Domain-Driven Design principles, this package includes implementations of | |
| 8 | - * entities and value objects specific to the chat context, such as ChatPrompt and | |
| 9 | - * ChatResponse, adhering to the ubiquitous language of chat interactions in AI models. | |
| 10 | - * | |
| 11 | - * This bounded context is designed to encapsulate all aspects of chat-based AI | |
| 12 | - * functionalities, maintaining a clear boundary from other contexts within the AI domain. | |
| 13 | - */ | |
| 14 | -package org.springframework.ai.chat; | |
| 15 | 0 | \ No newline at end of file |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/prompt/AssistantPromptTemplate.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.prompt; | |
| 18 | - | |
| 19 | -import org.springframework.ai.chat.messages.AssistantMessage; | |
| 20 | -import org.springframework.ai.chat.messages.Message; | |
| 21 | -import org.springframework.core.io.Resource; | |
| 22 | - | |
| 23 | -import java.util.Map; | |
| 24 | - | |
| 25 | -public class AssistantPromptTemplate extends PromptTemplate { | |
| 26 | - | |
| 27 | - public AssistantPromptTemplate(String template) { | |
| 28 | - super(template); | |
| 29 | - } | |
| 30 | - | |
| 31 | - public AssistantPromptTemplate(Resource resource) { | |
| 32 | - super(resource); | |
| 33 | - } | |
| 34 | - | |
| 35 | - @Override | |
| 36 | - public Prompt create() { | |
| 37 | - return new Prompt(new AssistantMessage(render())); | |
| 38 | - } | |
| 39 | - | |
| 40 | - @Override | |
| 41 | - public Prompt create(Map<String, Object> model) { | |
| 42 | - return new Prompt(new AssistantMessage(render(model))); | |
| 43 | - } | |
| 44 | - | |
| 45 | - @Override | |
| 46 | - public Message createMessage() { | |
| 47 | - return new AssistantMessage(render()); | |
| 48 | - } | |
| 49 | - | |
| 50 | - @Override | |
| 51 | - public Message createMessage(Map<String, Object> model) { | |
| 52 | - return new AssistantMessage(render(model)); | |
| 53 | - } | |
| 54 | - | |
| 55 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/prompt/ChatOptions.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.prompt; | |
| 18 | - | |
| 19 | -import org.springframework.ai.model.ModelOptions; | |
| 20 | - | |
| 21 | -/** | |
| 22 | - * 聊天选项代表了常见的选项,可在不同的聊天模式中移植。 | |
| 23 | - * | |
| 24 | - * The ChatOptions represent the common options, portable across different chat models. | |
| 25 | - */ | |
| 26 | -public interface ChatOptions extends ModelOptions { | |
| 27 | - | |
| 28 | - Float getTemperature(); | |
| 29 | - | |
| 30 | - void setTemperature(Float temperature); | |
| 31 | - | |
| 32 | - Float getTopP(); | |
| 33 | - | |
| 34 | - void setTopP(Float topP); | |
| 35 | - | |
| 36 | - Integer getTopK(); | |
| 37 | - | |
| 38 | - void setTopK(Integer topK); | |
| 39 | - | |
| 40 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/prompt/ChatOptionsBuilder.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.prompt; | |
| 18 | - | |
| 19 | -public class ChatOptionsBuilder { | |
| 20 | - | |
| 21 | - private class ChatOptionsImpl implements ChatOptions { | |
| 22 | - | |
| 23 | - private Float temperature; | |
| 24 | - | |
| 25 | - private Float topP; | |
| 26 | - | |
| 27 | - private Integer topK; | |
| 28 | - | |
| 29 | - @Override | |
| 30 | - public Float getTemperature() { | |
| 31 | - return temperature; | |
| 32 | - } | |
| 33 | - | |
| 34 | - @Override | |
| 35 | - public void setTemperature(Float temperature) { | |
| 36 | - this.temperature = temperature; | |
| 37 | - } | |
| 38 | - | |
| 39 | - @Override | |
| 40 | - public Float getTopP() { | |
| 41 | - return topP; | |
| 42 | - } | |
| 43 | - | |
| 44 | - @Override | |
| 45 | - public void setTopP(Float topP) { | |
| 46 | - this.topP = topP; | |
| 47 | - } | |
| 48 | - | |
| 49 | - @Override | |
| 50 | - public Integer getTopK() { | |
| 51 | - return topK; | |
| 52 | - } | |
| 53 | - | |
| 54 | - @Override | |
| 55 | - public void setTopK(Integer topK) { | |
| 56 | - this.topK = topK; | |
| 57 | - } | |
| 58 | - | |
| 59 | - } | |
| 60 | - | |
| 61 | - private final ChatOptionsImpl options = new ChatOptionsImpl(); | |
| 62 | - | |
| 63 | - private ChatOptionsBuilder() { | |
| 64 | - } | |
| 65 | - | |
| 66 | - public static ChatOptionsBuilder builder() { | |
| 67 | - return new ChatOptionsBuilder(); | |
| 68 | - } | |
| 69 | - | |
| 70 | - public ChatOptionsBuilder withTemperature(Float temperature) { | |
| 71 | - options.setTemperature(temperature); | |
| 72 | - return this; | |
| 73 | - } | |
| 74 | - | |
| 75 | - public ChatOptionsBuilder withTopP(Float topP) { | |
| 76 | - options.setTopP(topP); | |
| 77 | - return this; | |
| 78 | - } | |
| 79 | - | |
| 80 | - public ChatOptionsBuilder withTopK(Integer topK) { | |
| 81 | - options.setTopK(topK); | |
| 82 | - return this; | |
| 83 | - } | |
| 84 | - | |
| 85 | - public ChatOptions build() { | |
| 86 | - return options; | |
| 87 | - } | |
| 88 | - | |
| 89 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/prompt/ChatPromptTemplate.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.prompt; | |
| 18 | - | |
| 19 | -import org.springframework.ai.chat.messages.Message; | |
| 20 | - | |
| 21 | -import java.util.ArrayList; | |
| 22 | -import java.util.List; | |
| 23 | -import java.util.Map; | |
| 24 | - | |
| 25 | -/** | |
| 26 | - * PromptTemplate,用于将角色指定为字符串实现及其角色不足以满足您的需求。 | |
| 27 | - * | |
| 28 | - * A PromptTemplate that lets you specify the role as a string should the current | |
| 29 | - * implementations and their roles not suffice for your needs. | |
| 30 | - */ | |
| 31 | -public class ChatPromptTemplate implements PromptTemplateActions, PromptTemplateChatActions { | |
| 32 | - | |
| 33 | - private final List<PromptTemplate> promptTemplates; | |
| 34 | - | |
| 35 | - public ChatPromptTemplate(List<PromptTemplate> promptTemplates) { | |
| 36 | - this.promptTemplates = promptTemplates; | |
| 37 | - } | |
| 38 | - | |
| 39 | - @Override | |
| 40 | - public String render() { | |
| 41 | - StringBuilder sb = new StringBuilder(); | |
| 42 | - for (PromptTemplate promptTemplate : promptTemplates) { | |
| 43 | - sb.append(promptTemplate.render()); | |
| 44 | - } | |
| 45 | - return sb.toString(); | |
| 46 | - } | |
| 47 | - | |
| 48 | - @Override | |
| 49 | - public String render(Map<String, Object> model) { | |
| 50 | - StringBuilder sb = new StringBuilder(); | |
| 51 | - for (PromptTemplate promptTemplate : promptTemplates) { | |
| 52 | - sb.append(promptTemplate.render(model)); | |
| 53 | - } | |
| 54 | - return sb.toString(); | |
| 55 | - } | |
| 56 | - | |
| 57 | - @Override | |
| 58 | - public List<Message> createMessages() { | |
| 59 | - List<Message> messages = new ArrayList<>(); | |
| 60 | - for (PromptTemplate promptTemplate : promptTemplates) { | |
| 61 | - messages.add(promptTemplate.createMessage()); | |
| 62 | - } | |
| 63 | - return messages; | |
| 64 | - } | |
| 65 | - | |
| 66 | - @Override | |
| 67 | - public List<Message> createMessages(Map<String, Object> model) { | |
| 68 | - List<Message> messages = new ArrayList<>(); | |
| 69 | - for (PromptTemplate promptTemplate : promptTemplates) { | |
| 70 | - messages.add(promptTemplate.createMessage(model)); | |
| 71 | - } | |
| 72 | - return messages; | |
| 73 | - } | |
| 74 | - | |
| 75 | - @Override | |
| 76 | - public Prompt create() { | |
| 77 | - List<Message> messages = createMessages(); | |
| 78 | - return new Prompt(messages); | |
| 79 | - } | |
| 80 | - | |
| 81 | - @Override | |
| 82 | - public Prompt create(Map<String, Object> model) { | |
| 83 | - List<Message> messages = createMessages(model); | |
| 84 | - return new Prompt(messages); | |
| 85 | - } | |
| 86 | - | |
| 87 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/prompt/FunctionPromptTemplate.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.prompt; | |
| 18 | - | |
| 19 | -public class FunctionPromptTemplate extends PromptTemplate { | |
| 20 | - | |
| 21 | - private String name; | |
| 22 | - | |
| 23 | - public FunctionPromptTemplate(String template) { | |
| 24 | - super(template); | |
| 25 | - } | |
| 26 | - | |
| 27 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/prompt/Prompt.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.prompt; | |
| 18 | - | |
| 19 | -import org.springframework.ai.chat.messages.Message; | |
| 20 | -import org.springframework.ai.chat.messages.UserMessage; | |
| 21 | -import org.springframework.ai.model.ModelOptions; | |
| 22 | -import org.springframework.ai.model.ModelRequest; | |
| 23 | - | |
| 24 | -import java.util.Collections; | |
| 25 | -import java.util.List; | |
| 26 | -import java.util.Objects; | |
| 27 | - | |
| 28 | -/** | |
| 29 | - * 文字内容 | |
| 30 | - */ | |
| 31 | -public class Prompt implements ModelRequest<List<Message>> { | |
| 32 | - | |
| 33 | - private final List<Message> messages; | |
| 34 | - | |
| 35 | - private ChatOptions modelOptions; | |
| 36 | - | |
| 37 | - public Prompt(String contents) { | |
| 38 | - this(new UserMessage(contents)); | |
| 39 | - } | |
| 40 | - | |
| 41 | - public Prompt(Message message) { | |
| 42 | - this(Collections.singletonList(message)); | |
| 43 | - } | |
| 44 | - | |
| 45 | - public Prompt(List<Message> messages) { | |
| 46 | - this.messages = messages; | |
| 47 | - } | |
| 48 | - | |
| 49 | - public Prompt(String contents, ChatOptions modelOptions) { | |
| 50 | - this(new UserMessage(contents), modelOptions); | |
| 51 | - } | |
| 52 | - | |
| 53 | - public Prompt(Message message, ChatOptions modelOptions) { | |
| 54 | - this(Collections.singletonList(message), modelOptions); | |
| 55 | - } | |
| 56 | - | |
| 57 | - public Prompt(List<Message> messages, ChatOptions modelOptions) { | |
| 58 | - this.messages = messages; | |
| 59 | - this.modelOptions = modelOptions; | |
| 60 | - } | |
| 61 | - | |
| 62 | - public String getContents() { | |
| 63 | - StringBuilder sb = new StringBuilder(); | |
| 64 | - for (Message message : getInstructions()) { | |
| 65 | - sb.append(message.getContent()); | |
| 66 | - } | |
| 67 | - return sb.toString(); | |
| 68 | - } | |
| 69 | - | |
| 70 | - @Override | |
| 71 | - public ModelOptions getOptions() { | |
| 72 | - return this.modelOptions; | |
| 73 | - } | |
| 74 | - | |
| 75 | - @Override | |
| 76 | - public List<Message> getInstructions() { | |
| 77 | - return this.messages; | |
| 78 | - } | |
| 79 | - | |
| 80 | - @Override | |
| 81 | - public String toString() { | |
| 82 | - return "Prompt{" + "messages=" + this.messages + ", modelOptions=" + this.modelOptions + '}'; | |
| 83 | - } | |
| 84 | - | |
| 85 | - @Override | |
| 86 | - public boolean equals(Object o) { | |
| 87 | - if (this == o) | |
| 88 | - return true; | |
| 89 | -// if (!(o instanceof Prompt prompt)) | |
| 90 | -// return false; | |
| 91 | - if (!(o instanceof Prompt)) { | |
| 92 | - return false; | |
| 93 | - } | |
| 94 | - Prompt prompt = (Prompt) o; | |
| 95 | - return Objects.equals(this.messages, prompt.messages) && Objects.equals(this.modelOptions, prompt.modelOptions); | |
| 96 | - } | |
| 97 | - | |
| 98 | - @Override | |
| 99 | - public int hashCode() { | |
| 100 | - return Objects.hash(this.messages, this.modelOptions); | |
| 101 | - } | |
| 102 | - | |
| 103 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/prompt/PromptTemplate.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.prompt; | |
| 18 | - | |
| 19 | -import org.springframework.ai.chat.messages.Message; | |
| 20 | -import org.springframework.ai.chat.messages.UserMessage; | |
| 21 | -import org.springframework.ai.parser.OutputParser; | |
| 22 | -import org.antlr.runtime.Token; | |
| 23 | -import org.antlr.runtime.TokenStream; | |
| 24 | -import org.springframework.core.io.Resource; | |
| 25 | -import org.springframework.util.StreamUtils; | |
| 26 | -import org.stringtemplate.v4.ST; | |
| 27 | -import org.stringtemplate.v4.compiler.STLexer; | |
| 28 | - | |
| 29 | -import java.io.IOException; | |
| 30 | -import java.io.InputStream; | |
| 31 | -import java.nio.charset.Charset; | |
| 32 | -import java.util.*; | |
| 33 | -import java.util.Map.Entry; | |
| 34 | -import java.util.stream.Collectors; | |
| 35 | -import java.util.stream.IntStream; | |
| 36 | - | |
| 37 | -/** | |
| 38 | - * 用户输入的提示内容模板 | |
| 39 | - * | |
| 40 | - * 实现:提示词模板操作 提示词模板message相关操作 | |
| 41 | - */ | |
| 42 | -public class PromptTemplate implements PromptTemplateActions, PromptTemplateMessageActions { | |
| 43 | - | |
| 44 | - private ST st; | |
| 45 | - | |
| 46 | - private Map<String, Object> dynamicModel = new HashMap<>(); | |
| 47 | - | |
| 48 | - protected String template; | |
| 49 | - | |
| 50 | - protected TemplateFormat templateFormat = TemplateFormat.ST; | |
| 51 | - | |
| 52 | - private OutputParser outputParser; | |
| 53 | - | |
| 54 | - public PromptTemplate(Resource resource) { | |
| 55 | - try (InputStream inputStream = resource.getInputStream()) { | |
| 56 | - this.template = StreamUtils.copyToString(inputStream, Charset.defaultCharset()); | |
| 57 | - } | |
| 58 | - catch (IOException ex) { | |
| 59 | - throw new RuntimeException("Failed to read resource", ex); | |
| 60 | - } | |
| 61 | - try { | |
| 62 | - this.st = new ST(this.template, '{', '}'); | |
| 63 | - } | |
| 64 | - catch (Exception ex) { | |
| 65 | - throw new IllegalArgumentException("The template string is not valid.", ex); | |
| 66 | - } | |
| 67 | - } | |
| 68 | - | |
| 69 | - public PromptTemplate(String template) { | |
| 70 | - this.template = template; | |
| 71 | - // If the template string is not valid, an exception will be thrown | |
| 72 | - try { | |
| 73 | - this.st = new ST(this.template, '{', '}'); | |
| 74 | - } | |
| 75 | - catch (Exception ex) { | |
| 76 | - throw new IllegalArgumentException("The template string is not valid.", ex); | |
| 77 | - } | |
| 78 | - } | |
| 79 | - | |
| 80 | - public PromptTemplate(String template, Map<String, Object> model) { | |
| 81 | - this.template = template; | |
| 82 | - // If the template string is not valid, an exception will be thrown | |
| 83 | - try { | |
| 84 | - this.st = new ST(this.template, '{', '}'); | |
| 85 | - for (Entry<String, Object> entry : model.entrySet()) { | |
| 86 | - add(entry.getKey(), entry.getValue()); | |
| 87 | - dynamicModel.put(entry.getKey(), entry.getValue()); | |
| 88 | - } | |
| 89 | - } | |
| 90 | - catch (Exception ex) { | |
| 91 | - throw new IllegalArgumentException("The template string is not valid.", ex); | |
| 92 | - } | |
| 93 | - } | |
| 94 | - | |
| 95 | - public PromptTemplate(Resource resource, Map<String, Object> model) { | |
| 96 | - try (InputStream inputStream = resource.getInputStream()) { | |
| 97 | - this.template = StreamUtils.copyToString(inputStream, Charset.defaultCharset()); | |
| 98 | - } | |
| 99 | - catch (IOException ex) { | |
| 100 | - throw new RuntimeException("Failed to read resource", ex); | |
| 101 | - } | |
| 102 | - // If the template string is not valid, an exception will be thrown | |
| 103 | - try { | |
| 104 | - this.st = new ST(this.template, '{', '}'); | |
| 105 | - for (Entry<String, Object> entry : model.entrySet()) { | |
| 106 | - add(entry.getKey(), entry.getValue()); | |
| 107 | - dynamicModel.put(entry.getKey(), entry.getValue()); | |
| 108 | - } | |
| 109 | - } | |
| 110 | - catch (Exception ex) { | |
| 111 | - throw new IllegalArgumentException("The template string is not valid.", ex); | |
| 112 | - } | |
| 113 | - } | |
| 114 | - | |
| 115 | - public OutputParser getOutputParser() { | |
| 116 | - return outputParser; | |
| 117 | - } | |
| 118 | - | |
| 119 | - public void setOutputParser(OutputParser outputParser) { | |
| 120 | - Objects.requireNonNull(outputParser, "Output Parser can not be null"); | |
| 121 | - this.outputParser = outputParser; | |
| 122 | - } | |
| 123 | - | |
| 124 | - public void add(String name, Object value) { | |
| 125 | - this.st.add(name, value); | |
| 126 | - this.dynamicModel.put(name, value); | |
| 127 | - } | |
| 128 | - | |
| 129 | - public String getTemplate() { | |
| 130 | - return this.template; | |
| 131 | - } | |
| 132 | - | |
| 133 | - public TemplateFormat getTemplateFormat() { | |
| 134 | - return this.templateFormat; | |
| 135 | - } | |
| 136 | - | |
| 137 | - // Render Methods | |
| 138 | - @Override | |
| 139 | - public String render() { | |
| 140 | - validate(this.dynamicModel); | |
| 141 | - return st.render(); | |
| 142 | - } | |
| 143 | - | |
| 144 | - @Override | |
| 145 | - public String render(Map<String, Object> model) { | |
| 146 | - validate(model); | |
| 147 | - for (Entry<String, Object> entry : model.entrySet()) { | |
| 148 | - if (st.getAttribute(entry.getKey()) != null) { | |
| 149 | - st.remove(entry.getKey()); | |
| 150 | - } | |
| 151 | - if (entry.getValue() instanceof Resource) { | |
| 152 | - st.add(entry.getKey(), renderResource((Resource) entry.getValue())); | |
| 153 | - } | |
| 154 | - else { | |
| 155 | - st.add(entry.getKey(), entry.getValue()); | |
| 156 | - } | |
| 157 | - | |
| 158 | - } | |
| 159 | - return st.render(); | |
| 160 | - } | |
| 161 | - | |
| 162 | - private String renderResource(Resource resource) { | |
| 163 | - try { | |
| 164 | - return resource.getContentAsString(Charset.defaultCharset()); | |
| 165 | - } | |
| 166 | - catch (IOException e) { | |
| 167 | - throw new RuntimeException(e); | |
| 168 | - } | |
| 169 | - // try (InputStream inputStream = resource.getInputStream()) { | |
| 170 | - // return StreamUtils.copyToString(inputStream, Charset.defaultCharset()); | |
| 171 | - // } | |
| 172 | - // catch (IOException ex) { | |
| 173 | - // throw new RuntimeException(ex); | |
| 174 | - // } | |
| 175 | - } | |
| 176 | - | |
| 177 | - @Override | |
| 178 | - public Message createMessage() { | |
| 179 | - return new UserMessage(render()); | |
| 180 | - } | |
| 181 | - | |
| 182 | - @Override | |
| 183 | - public Message createMessage(Map<String, Object> model) { | |
| 184 | - return new UserMessage(render(model)); | |
| 185 | - } | |
| 186 | - | |
| 187 | - @Override | |
| 188 | - public Prompt create() { | |
| 189 | - return new Prompt(render(new HashMap<>())); | |
| 190 | - } | |
| 191 | - | |
| 192 | - @Override | |
| 193 | - public Prompt create(Map<String, Object> model) { | |
| 194 | - return new Prompt(render(model)); | |
| 195 | - } | |
| 196 | - | |
| 197 | - public Set<String> getInputVariables() { | |
| 198 | - TokenStream tokens = this.st.impl.tokens; | |
| 199 | - return IntStream.range(0, tokens.range()) | |
| 200 | - .mapToObj(tokens::get) | |
| 201 | - .filter(token -> token.getType() == STLexer.ID) | |
| 202 | - .map(Token::getText) | |
| 203 | - .collect(Collectors.toSet()); | |
| 204 | - } | |
| 205 | - | |
| 206 | - protected void validate(Map<String, Object> model) { | |
| 207 | - Set<String> dynamicVariableNames = new HashSet<>(this.dynamicModel.keySet()); | |
| 208 | - Set<String> modelVariables = new HashSet<>(model.keySet()); | |
| 209 | - modelVariables.addAll(dynamicVariableNames); | |
| 210 | - Set<String> missingEntries = new HashSet<>(getInputVariables()); | |
| 211 | - missingEntries.removeAll(modelVariables); | |
| 212 | - if (!missingEntries.isEmpty()) { | |
| 213 | - throw new IllegalStateException( | |
| 214 | - "All template variables were not replaced. Missing variable names are " + missingEntries); | |
| 215 | - } | |
| 216 | - } | |
| 217 | - | |
| 218 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateActions.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.prompt; | |
| 18 | - | |
| 19 | -import java.util.Map; | |
| 20 | - | |
| 21 | -/** | |
| 22 | - * 提示词模板操作 | |
| 23 | - */ | |
| 24 | -public interface PromptTemplateActions extends PromptTemplateStringActions { | |
| 25 | - | |
| 26 | - /** | |
| 27 | - * 创建 Prompt | |
| 28 | - * @return | |
| 29 | - */ | |
| 30 | - Prompt create(); | |
| 31 | - | |
| 32 | - Prompt create(Map<String, Object> model); | |
| 33 | - | |
| 34 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateChatActions.java deleted
| 1 | -package org.springframework.ai.chat.prompt; | |
| 2 | - | |
| 3 | -import org.springframework.ai.chat.messages.Message; | |
| 4 | - | |
| 5 | -import java.util.List; | |
| 6 | -import java.util.Map; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * 聊天操作 | |
| 10 | - * | |
| 11 | - */ | |
| 12 | -public interface PromptTemplateChatActions { | |
| 13 | - | |
| 14 | - List<Message> createMessages(); | |
| 15 | - | |
| 16 | - List<Message> createMessages(Map<String, Object> model); | |
| 17 | - | |
| 18 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateMessageActions.java deleted
| 1 | -package org.springframework.ai.chat.prompt; | |
| 2 | - | |
| 3 | -import org.springframework.ai.chat.messages.Message; | |
| 4 | - | |
| 5 | -import java.util.Map; | |
| 6 | - | |
| 7 | -/** | |
| 8 | - * 用户输入的提示内容 模板信息操作 | |
| 9 | - */ | |
| 10 | -public interface PromptTemplateMessageActions { | |
| 11 | - | |
| 12 | - /** | |
| 13 | - * 创建一个 message | |
| 14 | - * @return | |
| 15 | - */ | |
| 16 | - Message createMessage(); | |
| 17 | - | |
| 18 | - /** | |
| 19 | - * 创建一个 message | |
| 20 | - * @return | |
| 21 | - */ | |
| 22 | - Message createMessage(Map<String, Object> model); | |
| 23 | - | |
| 24 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateStringActions.java deleted
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/prompt/SystemPromptTemplate.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.prompt; | |
| 18 | - | |
| 19 | -import org.springframework.ai.chat.messages.Message; | |
| 20 | -import org.springframework.ai.chat.messages.SystemMessage; | |
| 21 | -import org.springframework.core.io.Resource; | |
| 22 | - | |
| 23 | -import java.util.Map; | |
| 24 | - | |
| 25 | -public class SystemPromptTemplate extends PromptTemplate { | |
| 26 | - | |
| 27 | - public SystemPromptTemplate(String template) { | |
| 28 | - super(template); | |
| 29 | - } | |
| 30 | - | |
| 31 | - public SystemPromptTemplate(Resource resource) { | |
| 32 | - super(resource); | |
| 33 | - } | |
| 34 | - | |
| 35 | - @Override | |
| 36 | - public Message createMessage() { | |
| 37 | - return new SystemMessage(render()); | |
| 38 | - } | |
| 39 | - | |
| 40 | - @Override | |
| 41 | - public Message createMessage(Map<String, Object> model) { | |
| 42 | - return new SystemMessage(render(model)); | |
| 43 | - } | |
| 44 | - | |
| 45 | - @Override | |
| 46 | - public Prompt create() { | |
| 47 | - return new Prompt(new SystemMessage(render())); | |
| 48 | - } | |
| 49 | - | |
| 50 | - @Override | |
| 51 | - public Prompt create(Map<String, Object> model) { | |
| 52 | - return new Prompt(new SystemMessage(render(model))); | |
| 53 | - } | |
| 54 | - | |
| 55 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/chat/prompt/TemplateFormat.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.chat.prompt; | |
| 18 | - | |
| 19 | -public enum TemplateFormat { | |
| 20 | - | |
| 21 | - ST("ST"); | |
| 22 | - | |
| 23 | - private final String value; | |
| 24 | - | |
| 25 | - TemplateFormat(String value) { | |
| 26 | - this.value = value; | |
| 27 | - } | |
| 28 | - | |
| 29 | - public String getValue() { | |
| 30 | - return value; | |
| 31 | - } | |
| 32 | - | |
| 33 | - public static TemplateFormat fromValue(String value) { | |
| 34 | - for (TemplateFormat templateFormat : TemplateFormat.values()) { | |
| 35 | - if (templateFormat.getValue().equals(value)) { | |
| 36 | - return templateFormat; | |
| 37 | - } | |
| 38 | - } | |
| 39 | - throw new IllegalArgumentException("Invalid TemplateFormat value: " + value); | |
| 40 | - } | |
| 41 | - | |
| 42 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/image/Image.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.image; | |
| 18 | - | |
| 19 | -import java.util.Objects; | |
| 20 | - | |
| 21 | -public class Image { | |
| 22 | - | |
| 23 | - /** | |
| 24 | - * 可以访问图像的URL。 | |
| 25 | - * | |
| 26 | - * The URL where the image can be accessed. | |
| 27 | - */ | |
| 28 | - private String url; | |
| 29 | - | |
| 30 | - /** | |
| 31 | - * Base64编码的图像字符串。 | |
| 32 | - * | |
| 33 | - * Base64 encoded image string. | |
| 34 | - */ | |
| 35 | - private String b64Json; | |
| 36 | - | |
| 37 | - public Image(String url, String b64Json) { | |
| 38 | - this.url = url; | |
| 39 | - this.b64Json = b64Json; | |
| 40 | - } | |
| 41 | - | |
| 42 | - public String getUrl() { | |
| 43 | - return url; | |
| 44 | - } | |
| 45 | - | |
| 46 | - public void setUrl(String url) { | |
| 47 | - this.url = url; | |
| 48 | - } | |
| 49 | - | |
| 50 | - public String getB64Json() { | |
| 51 | - return b64Json; | |
| 52 | - } | |
| 53 | - | |
| 54 | - public void setB64Json(String b64Json) { | |
| 55 | - this.b64Json = b64Json; | |
| 56 | - } | |
| 57 | - | |
| 58 | - @Override | |
| 59 | - public String toString() { | |
| 60 | - return "Image{" + "url='" + url + '\'' + ", b64Json='" + b64Json + '\'' + '}'; | |
| 61 | - } | |
| 62 | - | |
| 63 | - @Override | |
| 64 | - public boolean equals(Object o) { | |
| 65 | - if (this == o) | |
| 66 | - return true; | |
| 67 | - if (!(o instanceof Image image)) | |
| 68 | - return false; | |
| 69 | - return Objects.equals(url, image.url) && Objects.equals(b64Json, image.b64Json); | |
| 70 | - } | |
| 71 | - | |
| 72 | - @Override | |
| 73 | - public int hashCode() { | |
| 74 | - return Objects.hash(url, b64Json); | |
| 75 | - } | |
| 76 | - | |
| 77 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/image/ImageClient.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.image; | |
| 18 | - | |
| 19 | - | |
| 20 | -import org.springframework.ai.model.ModelClient; | |
| 21 | - | |
| 22 | -public interface ImageClient extends ModelClient<ImagePrompt, ImageResponse> { | |
| 23 | - | |
| 24 | - /** | |
| 25 | - * 跟 chat一样 | |
| 26 | - * @param imagePrompt the request object to be sent to the AI model | |
| 27 | - * @return | |
| 28 | - */ | |
| 29 | - ImageResponse call(ImagePrompt imagePrompt); | |
| 30 | - | |
| 31 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/image/ImageGeneration.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.image; | |
| 18 | - | |
| 19 | - | |
| 20 | -import org.springframework.ai.model.ModelResult; | |
| 21 | - | |
| 22 | -public class ImageGeneration implements ModelResult<Image> { | |
| 23 | - | |
| 24 | - // metadata 信息为空现在 | |
| 25 | - private ImageGenerationMetadata imageGenerationMetadata; | |
| 26 | - | |
| 27 | - private Image image; | |
| 28 | - | |
| 29 | - public ImageGeneration(Image image) { | |
| 30 | - this.image = image; | |
| 31 | - } | |
| 32 | - | |
| 33 | - public ImageGeneration(Image image, ImageGenerationMetadata imageGenerationMetadata) { | |
| 34 | - this.image = image; | |
| 35 | - this.imageGenerationMetadata = imageGenerationMetadata; | |
| 36 | - } | |
| 37 | - | |
| 38 | - @Override | |
| 39 | - public Image getOutput() { | |
| 40 | - return image; | |
| 41 | - } | |
| 42 | - | |
| 43 | - @Override | |
| 44 | - public ImageGenerationMetadata getMetadata() { | |
| 45 | - return imageGenerationMetadata; | |
| 46 | - } | |
| 47 | - | |
| 48 | - @Override | |
| 49 | - public String toString() { | |
| 50 | - return "ImageGeneration{" + "imageGenerationMetadata=" + imageGenerationMetadata + ", image=" + image + '}'; | |
| 51 | - } | |
| 52 | - | |
| 53 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/image/ImageGenerationMetadata.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.image; | |
| 18 | - | |
| 19 | -import org.springframework.ai.model.ResultMetadata; | |
| 20 | - | |
| 21 | -public interface ImageGenerationMetadata extends ResultMetadata { | |
| 22 | - | |
| 23 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/image/ImageMessage.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.image; | |
| 18 | - | |
| 19 | -import java.util.Objects; | |
| 20 | - | |
| 21 | -public class ImageMessage { | |
| 22 | - | |
| 23 | - private String text; | |
| 24 | - | |
| 25 | - private Float weight; | |
| 26 | - | |
| 27 | - public ImageMessage(String text) { | |
| 28 | - this.text = text; | |
| 29 | - } | |
| 30 | - | |
| 31 | - public ImageMessage(String text, Float weight) { | |
| 32 | - this.text = text; | |
| 33 | - this.weight = weight; | |
| 34 | - } | |
| 35 | - | |
| 36 | - public String getText() { | |
| 37 | - return text; | |
| 38 | - } | |
| 39 | - | |
| 40 | - public Float getWeight() { | |
| 41 | - return weight; | |
| 42 | - } | |
| 43 | - | |
| 44 | - @Override | |
| 45 | - public String toString() { | |
| 46 | - return "mageMessage{" + "text='" + text + '\'' + ", weight=" + weight + '}'; | |
| 47 | - } | |
| 48 | - | |
| 49 | - @Override | |
| 50 | - public boolean equals(Object o) { | |
| 51 | - if (this == o) | |
| 52 | - return true; | |
| 53 | - if (!(o instanceof ImageMessage that)) | |
| 54 | - return false; | |
| 55 | - return Objects.equals(text, that.text) && Objects.equals(weight, that.weight); | |
| 56 | - } | |
| 57 | - | |
| 58 | - @Override | |
| 59 | - public int hashCode() { | |
| 60 | - return Objects.hash(text, weight); | |
| 61 | - } | |
| 62 | - | |
| 63 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/image/ImageOptions.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.image; | |
| 18 | - | |
| 19 | -import org.springframework.ai.model.ModelOptions; | |
| 20 | - | |
| 21 | -/** | |
| 22 | - * ImageOptions represent the common options, portable across different image generation | |
| 23 | - * models. | |
| 24 | - */ | |
| 25 | -public interface ImageOptions extends ModelOptions { | |
| 26 | - | |
| 27 | - Integer getN(); | |
| 28 | - | |
| 29 | - String getModel(); | |
| 30 | - | |
| 31 | - Integer getWidth(); | |
| 32 | - | |
| 33 | - Integer getHeight(); | |
| 34 | - | |
| 35 | - String getResponseFormat(); // openai - url or base64 : stability ai byte[] or base64 | |
| 36 | - | |
| 37 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/image/ImageOptionsBuilder.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.image; | |
| 18 | - | |
| 19 | -public class ImageOptionsBuilder { | |
| 20 | - | |
| 21 | - private class ImageModelOptionsImpl implements ImageOptions { | |
| 22 | - | |
| 23 | - private Integer n; | |
| 24 | - | |
| 25 | - private String model; | |
| 26 | - | |
| 27 | - private Integer width; | |
| 28 | - | |
| 29 | - private Integer height; | |
| 30 | - | |
| 31 | - private String responseFormat; | |
| 32 | - | |
| 33 | - @Override | |
| 34 | - public Integer getN() { | |
| 35 | - return n; | |
| 36 | - } | |
| 37 | - | |
| 38 | - public void setN(Integer n) { | |
| 39 | - this.n = n; | |
| 40 | - } | |
| 41 | - | |
| 42 | - @Override | |
| 43 | - public String getModel() { | |
| 44 | - return model; | |
| 45 | - } | |
| 46 | - | |
| 47 | - public void setModel(String model) { | |
| 48 | - this.model = model; | |
| 49 | - } | |
| 50 | - | |
| 51 | - @Override | |
| 52 | - public String getResponseFormat() { | |
| 53 | - return responseFormat; | |
| 54 | - } | |
| 55 | - | |
| 56 | - public void setResponseFormat(String responseFormat) { | |
| 57 | - this.responseFormat = responseFormat; | |
| 58 | - } | |
| 59 | - | |
| 60 | - @Override | |
| 61 | - public Integer getWidth() { | |
| 62 | - return width; | |
| 63 | - } | |
| 64 | - | |
| 65 | - public void setWidth(Integer width) { | |
| 66 | - this.width = width; | |
| 67 | - } | |
| 68 | - | |
| 69 | - @Override | |
| 70 | - public Integer getHeight() { | |
| 71 | - return height; | |
| 72 | - } | |
| 73 | - | |
| 74 | - public void setHeight(Integer height) { | |
| 75 | - this.height = height; | |
| 76 | - } | |
| 77 | - | |
| 78 | - } | |
| 79 | - | |
| 80 | - private final ImageModelOptionsImpl options = new ImageModelOptionsImpl(); | |
| 81 | - | |
| 82 | - private ImageOptionsBuilder() { | |
| 83 | - | |
| 84 | - } | |
| 85 | - | |
| 86 | - public static ImageOptionsBuilder builder() { | |
| 87 | - return new ImageOptionsBuilder(); | |
| 88 | - } | |
| 89 | - | |
| 90 | - public ImageOptionsBuilder withN(Integer n) { | |
| 91 | - options.setN(n); | |
| 92 | - return this; | |
| 93 | - } | |
| 94 | - | |
| 95 | - public ImageOptionsBuilder withModel(String model) { | |
| 96 | - options.setModel(model); | |
| 97 | - return this; | |
| 98 | - } | |
| 99 | - | |
| 100 | - public ImageOptionsBuilder withResponseFormat(String responseFormat) { | |
| 101 | - options.setResponseFormat(responseFormat); | |
| 102 | - return this; | |
| 103 | - } | |
| 104 | - | |
| 105 | - public ImageOptionsBuilder withWidth(Integer width) { | |
| 106 | - options.setWidth(width); | |
| 107 | - return this; | |
| 108 | - } | |
| 109 | - | |
| 110 | - public ImageOptionsBuilder withHeight(Integer height) { | |
| 111 | - options.setHeight(height); | |
| 112 | - return this; | |
| 113 | - } | |
| 114 | - | |
| 115 | - public ImageOptions build() { | |
| 116 | - return options; | |
| 117 | - } | |
| 118 | - | |
| 119 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/image/ImagePrompt.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.image; | |
| 18 | - | |
| 19 | -import org.springframework.ai.model.ModelRequest; | |
| 20 | - | |
| 21 | -import java.util.Collections; | |
| 22 | -import java.util.List; | |
| 23 | -import java.util.Objects; | |
| 24 | - | |
| 25 | -/** | |
| 26 | - * 图片内容 | |
| 27 | - */ | |
| 28 | -public class ImagePrompt implements ModelRequest<List<ImageMessage>> { | |
| 29 | - | |
| 30 | - private final List<ImageMessage> messages; | |
| 31 | - | |
| 32 | - private ImageOptions imageModelOptions; | |
| 33 | - | |
| 34 | - public ImagePrompt(List<ImageMessage> messages) { | |
| 35 | - this.messages = messages; | |
| 36 | - } | |
| 37 | - | |
| 38 | - public ImagePrompt(List<ImageMessage> messages, ImageOptions imageModelOptions) { | |
| 39 | - this.messages = messages; | |
| 40 | - this.imageModelOptions = imageModelOptions; | |
| 41 | - } | |
| 42 | - | |
| 43 | - public ImagePrompt(ImageMessage imageMessage, ImageOptions imageOptions) { | |
| 44 | - this(Collections.singletonList(imageMessage), imageOptions); | |
| 45 | - } | |
| 46 | - | |
| 47 | - public ImagePrompt(String instructions, ImageOptions imageOptions) { | |
| 48 | - this(new ImageMessage(instructions), imageOptions); | |
| 49 | - } | |
| 50 | - | |
| 51 | - public ImagePrompt(String instructions) { | |
| 52 | -// this(new ImageMessage(instructions), ImageOptionsBuilder.builder().build()); | |
| 53 | - this(new ImageMessage(instructions), null); | |
| 54 | - } | |
| 55 | - | |
| 56 | - @Override | |
| 57 | - public List<ImageMessage> getInstructions() { | |
| 58 | - return messages; | |
| 59 | - } | |
| 60 | - | |
| 61 | - @Override | |
| 62 | - public ImageOptions getOptions() { | |
| 63 | - return imageModelOptions; | |
| 64 | - } | |
| 65 | - | |
| 66 | - @Override | |
| 67 | - public String toString() { | |
| 68 | - return "NewImagePrompt{" + "messages=" + messages + ", imageModelOptions=" + imageModelOptions + '}'; | |
| 69 | - } | |
| 70 | - | |
| 71 | - @Override | |
| 72 | - public boolean equals(Object o) { | |
| 73 | - if (this == o) | |
| 74 | - return true; | |
| 75 | - if (!(o instanceof ImagePrompt that)) | |
| 76 | - return false; | |
| 77 | - return Objects.equals(messages, that.messages) && Objects.equals(imageModelOptions, that.imageModelOptions); | |
| 78 | - } | |
| 79 | - | |
| 80 | - @Override | |
| 81 | - public int hashCode() { | |
| 82 | - return Objects.hash(messages, imageModelOptions); | |
| 83 | - } | |
| 84 | - | |
| 85 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/image/ImageResponse.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.image; | |
| 18 | - | |
| 19 | -import org.springframework.ai.model.ModelResponse; | |
| 20 | - | |
| 21 | -import java.util.List; | |
| 22 | -import java.util.Objects; | |
| 23 | - | |
| 24 | -public class ImageResponse implements ModelResponse<ImageGeneration> { | |
| 25 | - | |
| 26 | - private final ImageResponseMetadata imageResponseMetadata; | |
| 27 | - | |
| 28 | - private final List<ImageGeneration> imageGenerations; | |
| 29 | - | |
| 30 | - public ImageResponse(List<ImageGeneration> generations) { | |
| 31 | - this(generations, ImageResponseMetadata.NULL); | |
| 32 | - } | |
| 33 | - | |
| 34 | - public ImageResponse(List<ImageGeneration> generations, ImageResponseMetadata imageResponseMetadata) { | |
| 35 | - this.imageResponseMetadata = imageResponseMetadata; | |
| 36 | - this.imageGenerations = List.copyOf(generations); | |
| 37 | - } | |
| 38 | - | |
| 39 | - @Override | |
| 40 | - public ImageGeneration getResult() { | |
| 41 | - return imageGenerations.get(0); | |
| 42 | - } | |
| 43 | - | |
| 44 | - @Override | |
| 45 | - public List<ImageGeneration> getResults() { | |
| 46 | - return imageGenerations; | |
| 47 | - } | |
| 48 | - | |
| 49 | - @Override | |
| 50 | - public ImageResponseMetadata getMetadata() { | |
| 51 | - return imageResponseMetadata; | |
| 52 | - } | |
| 53 | - | |
| 54 | - @Override | |
| 55 | - public String toString() { | |
| 56 | - return "ImageResponse{" + "imageResponseMetadata=" + imageResponseMetadata + ", imageGenerations=" | |
| 57 | - + imageGenerations + '}'; | |
| 58 | - } | |
| 59 | - | |
| 60 | - @Override | |
| 61 | - public boolean equals(Object o) { | |
| 62 | - if (this == o) | |
| 63 | - return true; | |
| 64 | - if (!(o instanceof ImageResponse that)) | |
| 65 | - return false; | |
| 66 | - return Objects.equals(imageResponseMetadata, that.imageResponseMetadata) | |
| 67 | - && Objects.equals(imageGenerations, that.imageGenerations); | |
| 68 | - } | |
| 69 | - | |
| 70 | - @Override | |
| 71 | - public int hashCode() { | |
| 72 | - return Objects.hash(imageResponseMetadata, imageGenerations); | |
| 73 | - } | |
| 74 | - | |
| 75 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/image/ImageResponseMetadata.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.image; | |
| 18 | - | |
| 19 | - | |
| 20 | -import org.springframework.ai.model.ResponseMetadata; | |
| 21 | - | |
| 22 | -public interface ImageResponseMetadata extends ResponseMetadata { | |
| 23 | - | |
| 24 | - ImageResponseMetadata NULL = new ImageResponseMetadata() { | |
| 25 | - }; | |
| 26 | - | |
| 27 | - default Long created() { | |
| 28 | - return System.currentTimeMillis(); | |
| 29 | - } | |
| 30 | - | |
| 31 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/ModelClient.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model; | |
| 18 | - | |
| 19 | -/** | |
| 20 | - * The ModelClient interface provides a generic API for invoking AI models. It is designed | |
| 21 | - * to handle the interaction with various types of AI models by abstracting the process of | |
| 22 | - * sending requests and receiving responses. The interface uses Java generics to | |
| 23 | - * accommodate different types of requests and responses, enhancing flexibility and | |
| 24 | - * adaptability across different AI model implementations. | |
| 25 | - * | |
| 26 | - * @param <TReq> the generic type of the request to the AI model | |
| 27 | - * @param <TRes> the generic type of the response from the AI model | |
| 28 | - * @author Mark Pollack | |
| 29 | - * @since 0.8.0 | |
| 30 | - */ | |
| 31 | -public interface ModelClient<TReq extends ModelRequest<?>, TRes extends ModelResponse<?>> { | |
| 32 | - | |
| 33 | - /** | |
| 34 | - * Executes a method call to the AI model. | |
| 35 | - * @param request the request object to be sent to the AI model | |
| 36 | - * @return the response from the AI model | |
| 37 | - */ | |
| 38 | - TRes call(TReq request) throws Throwable; | |
| 39 | - | |
| 40 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/ModelOptions.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model; | |
| 18 | - | |
| 19 | -/** | |
| 20 | - * Interface representing the customizable options for AI model interactions. This marker | |
| 21 | - * interface allows for the specification of various settings and parameters that can | |
| 22 | - * influence the behavior and output of AI models. It is designed to provide flexibility | |
| 23 | - * and adaptability in different AI scenarios, ensuring that the AI models can be | |
| 24 | - * fine-tuned according to specific requirements. | |
| 25 | - * | |
| 26 | - * @author Mark Pollack | |
| 27 | - * @since 0.8.0 | |
| 28 | - */ | |
| 29 | -public interface ModelOptions { | |
| 30 | - | |
| 31 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/ModelOptionsUtils.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model; | |
| 18 | - | |
| 19 | -import com.fasterxml.jackson.annotation.JsonProperty; | |
| 20 | -import com.fasterxml.jackson.core.JsonProcessingException; | |
| 21 | -import com.fasterxml.jackson.core.type.TypeReference; | |
| 22 | -import com.fasterxml.jackson.databind.DeserializationFeature; | |
| 23 | -import com.fasterxml.jackson.databind.JsonNode; | |
| 24 | -import com.fasterxml.jackson.databind.ObjectMapper; | |
| 25 | -import com.fasterxml.jackson.databind.SerializationFeature; | |
| 26 | -import com.fasterxml.jackson.databind.node.ArrayNode; | |
| 27 | -import com.fasterxml.jackson.databind.node.ObjectNode; | |
| 28 | -import com.github.victools.jsonschema.generator.*; | |
| 29 | -import com.github.victools.jsonschema.module.jackson.JacksonModule; | |
| 30 | -import com.github.victools.jsonschema.module.jackson.JacksonOption; | |
| 31 | -import com.github.victools.jsonschema.module.swagger2.Swagger2Module; | |
| 32 | -import org.springframework.beans.BeanWrapper; | |
| 33 | -import org.springframework.beans.BeanWrapperImpl; | |
| 34 | -import org.springframework.util.Assert; | |
| 35 | -import org.springframework.util.CollectionUtils; | |
| 36 | - | |
| 37 | -import java.beans.PropertyDescriptor; | |
| 38 | -import java.lang.reflect.Field; | |
| 39 | -import java.util.*; | |
| 40 | -import java.util.concurrent.ConcurrentHashMap; | |
| 41 | -import java.util.concurrent.atomic.AtomicReference; | |
| 42 | -import java.util.stream.Collectors; | |
| 43 | - | |
| 44 | -/** | |
| 45 | - * Utility class for manipulating {@link ModelOptions} objects. | |
| 46 | - * | |
| 47 | - * @author Christian Tzolov | |
| 48 | - * @since 0.8.0 | |
| 49 | - */ | |
| 50 | -public final class ModelOptionsUtils { | |
| 51 | - | |
| 52 | - private final static ObjectMapper OBJECT_MAPPER = new ObjectMapper() | |
| 53 | - .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) | |
| 54 | - .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); | |
| 55 | - | |
| 56 | - private final static List<String> BEAN_MERGE_FIELD_EXCISIONS = List.of("class"); | |
| 57 | - | |
| 58 | - private static ConcurrentHashMap<Class<?>, List<String>> REQUEST_FIELD_NAMES_PER_CLASS = new ConcurrentHashMap<Class<?>, List<String>>(); | |
| 59 | - | |
| 60 | - private static AtomicReference<SchemaGenerator> SCHEMA_GENERATOR_CACHE = new AtomicReference<>(); | |
| 61 | - | |
| 62 | - private ModelOptionsUtils() { | |
| 63 | - | |
| 64 | - } | |
| 65 | - | |
| 66 | - /** | |
| 67 | - * Converts the given JSON string to a Map of String and Object. | |
| 68 | - * @param json the JSON string to convert to a Map. | |
| 69 | - * @return the converted Map. | |
| 70 | - */ | |
| 71 | - public static Map<String, Object> jsonToMap(String json) { | |
| 72 | - try { | |
| 73 | - return OBJECT_MAPPER.readValue(json, MAP_TYPE_REF); | |
| 74 | - } | |
| 75 | - catch (Exception e) { | |
| 76 | - throw new RuntimeException(e); | |
| 77 | - } | |
| 78 | - } | |
| 79 | - | |
| 80 | - private static TypeReference<HashMap<String, Object>> MAP_TYPE_REF = new TypeReference<HashMap<String, Object>>() { | |
| 81 | - }; | |
| 82 | - | |
| 83 | - /** | |
| 84 | - * Converts the given JSON string to an Object of the given type. | |
| 85 | - * @param <T> the type of the object to return. | |
| 86 | - * @param json the JSON string to convert to an object. | |
| 87 | - * @param type the type of the object to return. | |
| 88 | - * @return Object instance of the given type. | |
| 89 | - */ | |
| 90 | - public static <T> T jsonToObject(String json, Class<T> type) { | |
| 91 | - try { | |
| 92 | - return OBJECT_MAPPER.readValue(json, type); | |
| 93 | - } | |
| 94 | - catch (Exception e) { | |
| 95 | - throw new RuntimeException("Failed to json: " + json, e); | |
| 96 | - } | |
| 97 | - } | |
| 98 | - | |
| 99 | - /** | |
| 100 | - * Converts the given object to a JSON string. | |
| 101 | - * @param object the object to convert to a JSON string. | |
| 102 | - * @return the JSON string. | |
| 103 | - */ | |
| 104 | - public static String toJsonString(Object object) { | |
| 105 | - try { | |
| 106 | - return OBJECT_MAPPER.writeValueAsString(object); | |
| 107 | - } | |
| 108 | - catch (JsonProcessingException e) { | |
| 109 | - throw new RuntimeException(e); | |
| 110 | - } | |
| 111 | - } | |
| 112 | - | |
| 113 | - /** | |
| 114 | - * Merges the source object into the target object and returns an object represented | |
| 115 | - * by the given class. The JSON property names are used to match the fields to merge. | |
| 116 | - * The source non-null values override the target values with the same field name. The | |
| 117 | - * source null values are ignored. If the acceptedFieldNames is not empty, only the | |
| 118 | - * fields with the given names are merged and returned. If the acceptedFieldNames is | |
| 119 | - * empty, use the {@code @JsonProperty} names, inferred from the provided clazz. | |
| 120 | - * @param <T> they type of the class to return. | |
| 121 | - * @param source the source object to merge. | |
| 122 | - * @param target the target object to merge into. | |
| 123 | - * @param clazz the class to return. | |
| 124 | - * @param acceptedFieldNames the list of field names accepted for the target object. | |
| 125 | - * @return the merged object represented by the given class. | |
| 126 | - */ | |
| 127 | - public static <T> T merge(Object source, Object target, Class<T> clazz, List<String> acceptedFieldNames) { | |
| 128 | - | |
| 129 | - if (source == null) { | |
| 130 | - source = Map.of(); | |
| 131 | - } | |
| 132 | - | |
| 133 | - List<String> requestFieldNames = CollectionUtils.isEmpty(acceptedFieldNames) | |
| 134 | - ? REQUEST_FIELD_NAMES_PER_CLASS.computeIfAbsent(clazz, ModelOptionsUtils::getJsonPropertyValues) | |
| 135 | - : acceptedFieldNames; | |
| 136 | - | |
| 137 | - if (CollectionUtils.isEmpty(requestFieldNames)) { | |
| 138 | - throw new IllegalArgumentException("No @JsonProperty fields found in the " + clazz.getName()); | |
| 139 | - } | |
| 140 | - | |
| 141 | - Map<String, Object> sourceMap = ModelOptionsUtils.objectToMap(source); | |
| 142 | - Map<String, Object> targetMap = ModelOptionsUtils.objectToMap(target); | |
| 143 | - | |
| 144 | - targetMap.putAll(sourceMap.entrySet() | |
| 145 | - .stream() | |
| 146 | - .filter(e -> e.getValue() != null) | |
| 147 | - .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()))); | |
| 148 | - | |
| 149 | - targetMap = targetMap.entrySet() | |
| 150 | - .stream() | |
| 151 | - .filter(e -> requestFieldNames.contains(e.getKey())) | |
| 152 | - .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); | |
| 153 | - | |
| 154 | - return ModelOptionsUtils.mapToClass(targetMap, clazz); | |
| 155 | - } | |
| 156 | - | |
| 157 | - /** | |
| 158 | - * Merges the source object into the target object and returns an object represented | |
| 159 | - * by the given class. The JSON property names are used to match the fields to merge. | |
| 160 | - * The source non-null values override the target values with the same field name. The | |
| 161 | - * source null values are ignored. Returns the only field names that match the | |
| 162 | - * {@code @JsonProperty} names, inferred from the provided clazz. | |
| 163 | - * @param <T> they type of the class to return. | |
| 164 | - * @param source the source object to merge. | |
| 165 | - * @param target the target object to merge into. | |
| 166 | - * @param clazz the class to return. | |
| 167 | - * @return the merged object represented by the given class. | |
| 168 | - */ | |
| 169 | - public static <T> T merge(Object source, Object target, Class<T> clazz) { | |
| 170 | - return ModelOptionsUtils.merge(source, target, clazz, null); | |
| 171 | - } | |
| 172 | - | |
| 173 | - /** | |
| 174 | - * Converts the given object to a Map. | |
| 175 | - * @param source the object to convert to a Map. | |
| 176 | - * @return the converted Map. | |
| 177 | - */ | |
| 178 | - public static Map<String, Object> objectToMap(Object source) { | |
| 179 | - if (source == null) { | |
| 180 | - return new HashMap<>(); | |
| 181 | - } | |
| 182 | - try { | |
| 183 | - String json = OBJECT_MAPPER.writeValueAsString(source); | |
| 184 | - return OBJECT_MAPPER.readValue(json, new TypeReference<Map<String, Object>>() { | |
| 185 | - }) | |
| 186 | - .entrySet() | |
| 187 | - .stream() | |
| 188 | - .filter(e -> e.getValue() != null) | |
| 189 | - .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); | |
| 190 | - } | |
| 191 | - catch (JsonProcessingException e) { | |
| 192 | - throw new RuntimeException(e); | |
| 193 | - } | |
| 194 | - } | |
| 195 | - | |
| 196 | - /** | |
| 197 | - * Converts the given Map to the given class. | |
| 198 | - * @param <T> the type of the class to return. | |
| 199 | - * @param source the Map to convert to the given class. | |
| 200 | - * @param clazz the class to convert the Map to. | |
| 201 | - * @return the converted class. | |
| 202 | - */ | |
| 203 | - public static <T> T mapToClass(Map<String, Object> source, Class<T> clazz) { | |
| 204 | - try { | |
| 205 | - String json = OBJECT_MAPPER.writeValueAsString(source); | |
| 206 | - return OBJECT_MAPPER.readValue(json, clazz); | |
| 207 | - } | |
| 208 | - catch (JsonProcessingException e) { | |
| 209 | - throw new RuntimeException(e); | |
| 210 | - } | |
| 211 | - } | |
| 212 | - | |
| 213 | - /** | |
| 214 | - * Returns the list of name values of the {@link JsonProperty} annotations. | |
| 215 | - * @param clazz the class that contains fields annotated with {@link JsonProperty}. | |
| 216 | - * @return the list of values of the {@link JsonProperty} annotations. | |
| 217 | - */ | |
| 218 | - public static List<String> getJsonPropertyValues(Class<?> clazz) { | |
| 219 | - List<String> values = new ArrayList<>(); | |
| 220 | - Field[] fields = clazz.getDeclaredFields(); | |
| 221 | - for (Field field : fields) { | |
| 222 | - JsonProperty jsonPropertyAnnotation = field.getAnnotation(JsonProperty.class); | |
| 223 | - if (jsonPropertyAnnotation != null) { | |
| 224 | - values.add(jsonPropertyAnnotation.value()); | |
| 225 | - } | |
| 226 | - } | |
| 227 | - return values; | |
| 228 | - } | |
| 229 | - | |
| 230 | - /** | |
| 231 | - * Returns a new instance of the targetBeanClazz that copies the bean values from the | |
| 232 | - * sourceBean instance. | |
| 233 | - * @param sourceBean the source bean to copy the values from. | |
| 234 | - * @param sourceInterfaceClazz the source interface class. Only the fields with the | |
| 235 | - * same name as the interface methods are copied. This allow the source object to be a | |
| 236 | - * subclass of the source interface with additional, non-interface fields. | |
| 237 | - * @param targetBeanClazz the target class, a subclass of the ChatOptions, to convert | |
| 238 | - * into. | |
| 239 | - * @param <T> the target class type. | |
| 240 | - * @return a new instance of the targetBeanClazz with the values from the sourceBean | |
| 241 | - * instance. | |
| 242 | - */ | |
| 243 | - public static <I, S extends I, T extends S> T copyToTarget(S sourceBean, Class<I> sourceInterfaceClazz, | |
| 244 | - Class<T> targetBeanClazz) { | |
| 245 | - | |
| 246 | - Assert.notNull(sourceInterfaceClazz, "SourceOptionsClazz must not be null"); | |
| 247 | - Assert.notNull(targetBeanClazz, "TargetOptionsClazz must not be null"); | |
| 248 | - | |
| 249 | - if (sourceBean == null) { | |
| 250 | - return null; | |
| 251 | - } | |
| 252 | - | |
| 253 | - if (sourceBean.getClass().isAssignableFrom(targetBeanClazz)) { | |
| 254 | - return (T) sourceBean; | |
| 255 | - } | |
| 256 | - | |
| 257 | - try { | |
| 258 | - T targetOptions = targetBeanClazz.getConstructor().newInstance(); | |
| 259 | - | |
| 260 | - ModelOptionsUtils.mergeBeans(sourceBean, targetOptions, sourceInterfaceClazz, true); | |
| 261 | - | |
| 262 | - return targetOptions; | |
| 263 | - } | |
| 264 | - catch (Exception e) { | |
| 265 | - throw new RuntimeException( | |
| 266 | - "Failed to convert the " + sourceInterfaceClazz.getName() + " into " + targetBeanClazz.getName(), | |
| 267 | - e); | |
| 268 | - } | |
| 269 | - } | |
| 270 | - | |
| 271 | - /** | |
| 272 | - * Merges the source object into the target object. The source null values are | |
| 273 | - * ignored. Only objects with Getter and Setter methods are supported. | |
| 274 | - * @param <T> the type of the source and target object. | |
| 275 | - * @param source the source object to merge. | |
| 276 | - * @param target the target object to merge into. | |
| 277 | - * @param sourceInterfaceClazz the source interface class. Only the fields with the | |
| 278 | - * same name as the interface methods are merged. This allow the source object to be a | |
| 279 | - * subclass of the source interface with additional, non-interface fields. | |
| 280 | - * @param overrideNonNullTargetValues if true, the source non-null values override the | |
| 281 | - * target values with the same field name. If false, the source non-null values are | |
| 282 | - * ignored. | |
| 283 | - * @return the merged target object. | |
| 284 | - */ | |
| 285 | - public static <I, S extends I, T extends S> T mergeBeans(S source, T target, Class<I> sourceInterfaceClazz, | |
| 286 | - boolean overrideNonNullTargetValues) { | |
| 287 | - Assert.notNull(source, "Source object must not be null"); | |
| 288 | - Assert.notNull(target, "Target object must not be null"); | |
| 289 | - | |
| 290 | - BeanWrapper sourceBeanWrap = new BeanWrapperImpl(source); | |
| 291 | - BeanWrapper targetBeanWrap = new BeanWrapperImpl(target); | |
| 292 | - | |
| 293 | - List<String> interfaceNames = Arrays.stream(sourceInterfaceClazz.getMethods()).map(m -> m.getName()).toList(); | |
| 294 | - | |
| 295 | - for (PropertyDescriptor descriptor : sourceBeanWrap.getPropertyDescriptors()) { | |
| 296 | - | |
| 297 | - if (!BEAN_MERGE_FIELD_EXCISIONS.contains(descriptor.getName()) | |
| 298 | - && interfaceNames.contains(toGetName(descriptor.getName()))) { | |
| 299 | - | |
| 300 | - String propertyName = descriptor.getName(); | |
| 301 | - Object value = sourceBeanWrap.getPropertyValue(propertyName); | |
| 302 | - | |
| 303 | - // Copy value to the target object | |
| 304 | - if (value != null) { | |
| 305 | - var targetValue = targetBeanWrap.getPropertyValue(propertyName); | |
| 306 | - | |
| 307 | - if (targetValue == null || overrideNonNullTargetValues) { | |
| 308 | - targetBeanWrap.setPropertyValue(propertyName, value); | |
| 309 | - } | |
| 310 | - } | |
| 311 | - } | |
| 312 | - } | |
| 313 | - | |
| 314 | - return target; | |
| 315 | - } | |
| 316 | - | |
| 317 | - private static String toGetName(String name) { | |
| 318 | - return "get" + name.substring(0, 1).toUpperCase() + name.substring(1); | |
| 319 | - } | |
| 320 | - | |
| 321 | - /** | |
| 322 | - * Generates JSON Schema (version 2020_12) for the given class. | |
| 323 | - * @param clazz the class to generate JSON Schema for. | |
| 324 | - * @param toUpperCaseTypeValues if true, the type values are converted to upper case. | |
| 325 | - * @return the generated JSON Schema as a String. | |
| 326 | - */ | |
| 327 | - public static String getJsonSchema(Class<?> clazz, boolean toUpperCaseTypeValues) { | |
| 328 | - | |
| 329 | - if (SCHEMA_GENERATOR_CACHE.get() == null) { | |
| 330 | - | |
| 331 | - JacksonModule jacksonModule = new JacksonModule(JacksonOption.RESPECT_JSONPROPERTY_REQUIRED); | |
| 332 | - Swagger2Module swaggerModule = new Swagger2Module(); | |
| 333 | - | |
| 334 | - SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_2020_12, | |
| 335 | - OptionPreset.PLAIN_JSON) | |
| 336 | - .with(Option.EXTRA_OPEN_API_FORMAT_VALUES) | |
| 337 | - .with(Option.PLAIN_DEFINITION_KEYS) | |
| 338 | - .with(swaggerModule) | |
| 339 | - .with(jacksonModule); | |
| 340 | - | |
| 341 | - SchemaGeneratorConfig config = configBuilder.build(); | |
| 342 | - SchemaGenerator generator = new SchemaGenerator(config); | |
| 343 | - SCHEMA_GENERATOR_CACHE.compareAndSet(null, generator); | |
| 344 | - } | |
| 345 | - | |
| 346 | - ObjectNode node = SCHEMA_GENERATOR_CACHE.get().generateSchema(clazz); | |
| 347 | - if (toUpperCaseTypeValues) { // Required for OpenAPI 3.0 (at least Vertex AI | |
| 348 | - // version of it). | |
| 349 | - toUpperCaseTypeValues(node); | |
| 350 | - } | |
| 351 | - | |
| 352 | - return node.toPrettyString(); | |
| 353 | - } | |
| 354 | - | |
| 355 | - public static void toUpperCaseTypeValues(ObjectNode node) { | |
| 356 | - if (node == null) { | |
| 357 | - return; | |
| 358 | - } | |
| 359 | - if (node.isObject()) { | |
| 360 | - node.fields().forEachRemaining(entry -> { | |
| 361 | - JsonNode value = entry.getValue(); | |
| 362 | - if (value.isObject()) { | |
| 363 | - toUpperCaseTypeValues((ObjectNode) value); | |
| 364 | - } | |
| 365 | - else if (value.isArray()) { | |
| 366 | - ((ArrayNode) value).elements().forEachRemaining(element -> { | |
| 367 | - if (element.isObject() || element.isArray()) { | |
| 368 | - toUpperCaseTypeValues((ObjectNode) element); | |
| 369 | - } | |
| 370 | - }); | |
| 371 | - } | |
| 372 | - else if (value.isTextual() && entry.getKey().equals("type")) { | |
| 373 | - String oldValue = ((ObjectNode) node).get("type").asText(); | |
| 374 | - ((ObjectNode) node).put("type", oldValue.toUpperCase()); | |
| 375 | - } | |
| 376 | - }); | |
| 377 | - } | |
| 378 | - else if (node.isArray()) { | |
| 379 | - node.elements().forEachRemaining(element -> { | |
| 380 | - if (element.isObject() || element.isArray()) { | |
| 381 | - toUpperCaseTypeValues((ObjectNode) element); | |
| 382 | - } | |
| 383 | - }); | |
| 384 | - } | |
| 385 | - } | |
| 386 | - | |
| 387 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/ModelRequest.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model; | |
| 18 | - | |
| 19 | -/** | |
| 20 | - * 表示对AI模型的请求的接口。此接口封装了 与人工智能模型交互所需的必要信息,包括指令或 输入(通用类型T)和附加模型选项。它提供了一种标准化的方式 | |
| 21 | - * 向人工智能模型发送请求,确保包括所有必要的细节,并且可以易于管理。 | |
| 22 | - * | |
| 23 | - * Interface representing a request to an AI model. This interface encapsulates the | |
| 24 | - * necessary information required to interact with an AI model, including instructions or | |
| 25 | - * inputs (of generic type T) and additional model options. It provides a standardized way | |
| 26 | - * to send requests to AI models, ensuring that all necessary details are included and can | |
| 27 | - * be easily managed. | |
| 28 | - * | |
| 29 | - * @param <T> the type of instructions or input required by the AI model | |
| 30 | - * @author Mark Pollack | |
| 31 | - * @since 0.8.0 | |
| 32 | - */ | |
| 33 | -public interface ModelRequest<T> { | |
| 34 | - | |
| 35 | - /** | |
| 36 | - * 检索AI模型所需的指令或输入。 返回AI模型所需的指令或输入 | |
| 37 | - * | |
| 38 | - * Retrieves the instructions or input required by the AI model. | |
| 39 | - * @return the instructions or input required by the AI model | |
| 40 | - */ | |
| 41 | - T getInstructions(); // required input | |
| 42 | - | |
| 43 | - /** | |
| 44 | - * 检索人工智能模型交互的可自定义选项。 返回AI模型交互的自定义选项 | |
| 45 | - * | |
| 46 | - * Retrieves the customizable options for AI model interactions. | |
| 47 | - * @return the customizable options for AI model interactions | |
| 48 | - */ | |
| 49 | - ModelOptions getOptions(); | |
| 50 | - | |
| 51 | -} | |
| 52 | 0 | \ No newline at end of file |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/ModelResponse.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model; | |
| 18 | - | |
| 19 | -import java.util.List; | |
| 20 | - | |
| 21 | -/** | |
| 22 | - * | |
| 23 | - * 表示从AI模型接收到的响应的接口。此接口提供 访问AI模型生成的主要结果或结果列表的方法,以及 以及响应元数据。它是封装和管理的标准化方式 | |
| 24 | - * 人工智能模型的输出,确保轻松检索和处理生成的信息 | |
| 25 | - * | |
| 26 | - * Interface representing the response received from an AI model. This interface provides | |
| 27 | - * methods to access the main result or a list of results generated by the AI model, along | |
| 28 | - * with the response metadata. It serves as a standardized way to encapsulate and manage | |
| 29 | - * the output from AI models, ensuring easy retrieval and processing of the generated | |
| 30 | - * information. | |
| 31 | - * | |
| 32 | - * @param <T> the type of the result(s) provided by the AI model | |
| 33 | - * @author Mark Pollack | |
| 34 | - * @since 0.8.0 | |
| 35 | - */ | |
| 36 | -public interface ModelResponse<T extends ModelResult<?>> { | |
| 37 | - | |
| 38 | - /** | |
| 39 | - * 检索AI模型的结果。 | |
| 40 | - * | |
| 41 | - * Retrieves the result of the AI model. | |
| 42 | - * @return the result generated by the AI model | |
| 43 | - */ | |
| 44 | - T getResult(); | |
| 45 | - | |
| 46 | - /** | |
| 47 | - * 检索AI模型生成的输出列表。 | |
| 48 | - * | |
| 49 | - * Retrieves the list of generated outputs by the AI model. | |
| 50 | - * @return the list of generated outputs | |
| 51 | - */ | |
| 52 | - List<T> getResults(); | |
| 53 | - | |
| 54 | - /** | |
| 55 | - * 检索与AI模型的响应相关联的响应元数据。 | |
| 56 | - * | |
| 57 | - * Retrieves the response metadata associated with the AI model's response. | |
| 58 | - * @return the response metadata | |
| 59 | - */ | |
| 60 | - ResponseMetadata getMetadata(); | |
| 61 | - | |
| 62 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/ModelResult.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model; | |
| 18 | - | |
| 19 | -/** | |
| 20 | - * This interface provides methods to access the main output of the AI model and the | |
| 21 | - * metadata associated with this result. It is designed to offer a standardized and | |
| 22 | - * comprehensive way to handle and interpret the outputs generated by AI models, catering | |
| 23 | - * to diverse AI applications and use cases. | |
| 24 | - * | |
| 25 | - * @param <T> the type of the output generated by the AI model | |
| 26 | - * @author Mark Pollack | |
| 27 | - * @since 0.8.0 | |
| 28 | - */ | |
| 29 | -public interface ModelResult<T> { | |
| 30 | - | |
| 31 | - /** | |
| 32 | - * Retrieves the output generated by the AI model. | |
| 33 | - * @return the output generated by the AI model | |
| 34 | - */ | |
| 35 | - T getOutput(); | |
| 36 | - | |
| 37 | - /** | |
| 38 | - * Retrieves the metadata associated with the result of an AI model. | |
| 39 | - * @return the metadata associated with the result | |
| 40 | - */ | |
| 41 | - ResultMetadata getMetadata(); | |
| 42 | - | |
| 43 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/ResponseMetadata.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model; | |
| 18 | - | |
| 19 | -/** | |
| 20 | - * 表示与AI模型的响应相关联的元数据的接口。此接口 旨在提供有关人工智能生成反应的附加信息 模型,包括处理细节和模型特定数据。它是一种价值 | |
| 21 | - * 核心领域内的对象,增强对人工智能模型的理解和管理 在各种应用中的响应。 | |
| 22 | - * | |
| 23 | - * Interface representing metadata associated with an AI model's response. This interface | |
| 24 | - * is designed to provide additional information about the generative response from an AI | |
| 25 | - * model, including processing details and model-specific data. It serves as a value | |
| 26 | - * object within the core domain, enhancing the understanding and management of AI model | |
| 27 | - * responses in various applications. | |
| 28 | - * | |
| 29 | - * @author Mark Pollack | |
| 30 | - * @since 0.8.0 | |
| 31 | - */ | |
| 32 | -public interface ResponseMetadata { | |
| 33 | - | |
| 34 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/ResultMetadata.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model; | |
| 18 | - | |
| 19 | -/** | |
| 20 | - * Interface representing metadata associated with the results of an AI model. This | |
| 21 | - * interface focuses on providing additional context and insights into the results | |
| 22 | - * generated by AI models. It could include information like computation time, model | |
| 23 | - * version, or other relevant details that enhance understanding and management of AI | |
| 24 | - * model outputs in various applications. | |
| 25 | - * | |
| 26 | - * @author Mark Pollack | |
| 27 | - * @since 0.8.0 | |
| 28 | - */ | |
| 29 | -public interface ResultMetadata { | |
| 30 | - | |
| 31 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/StreamingModelClient.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model; | |
| 18 | - | |
| 19 | -import reactor.core.publisher.Flux; | |
| 20 | - | |
| 21 | -/** | |
| 22 | - * The StreamingModelClient interface provides a generic API for invoking a AI models with | |
| 23 | - * streaming response. It abstracts the process of sending requests and receiving a | |
| 24 | - * streaming responses. The interface uses Java generics to accommodate different types of | |
| 25 | - * requests and responses, enhancing flexibility and adaptability across different AI | |
| 26 | - * model implementations. | |
| 27 | - * | |
| 28 | - * @param <TReq> the generic type of the request to the AI model | |
| 29 | - * @param <TResChunk> the generic type of a single item in the streaming response from the | |
| 30 | - * AI model | |
| 31 | - * @author Christian Tzolov | |
| 32 | - * @since 0.8.0 | |
| 33 | - */ | |
| 34 | -public interface StreamingModelClient<TReq extends ModelRequest<?>, TResChunk extends ModelResponse<?>> { | |
| 35 | - | |
| 36 | - /** | |
| 37 | - * Executes a method call to the AI model. | |
| 38 | - * @param request the request object to be sent to the AI model | |
| 39 | - * @return the streaming response from the AI model | |
| 40 | - */ | |
| 41 | - Flux<TResChunk> stream(TReq request); | |
| 42 | - | |
| 43 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/function/AbstractFunctionCallSupport.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model.function; | |
| 18 | - | |
| 19 | -import org.springframework.util.CollectionUtils; | |
| 20 | - | |
| 21 | -import java.util.*; | |
| 22 | -import java.util.concurrent.ConcurrentHashMap; | |
| 23 | - | |
| 24 | -/** | |
| 25 | - * @author Christian Tzolov | |
| 26 | - */ | |
| 27 | -public abstract class AbstractFunctionCallSupport<Msg, Req, Resp> { | |
| 28 | - | |
| 29 | - protected final static boolean IS_RUNTIME_CALL = true; | |
| 30 | - | |
| 31 | - /** | |
| 32 | - * 函数回调寄存器用于按名称解析函数回调。 | |
| 33 | - * | |
| 34 | - * The function callback register is used to resolve the function callbacks by name. | |
| 35 | - */ | |
| 36 | - protected final Map<String, FunctionCallback> functionCallbackRegister = new ConcurrentHashMap<>(); | |
| 37 | - | |
| 38 | - /** | |
| 39 | - * 函数回调上下文用于按名称解析函数回调来自Spring上下文。 | |
| 40 | - * 它是可选的,通常与Spring一起使用自动配置。 | |
| 41 | - * | |
| 42 | - * The function callback context is used to resolve the function callbacks by name | |
| 43 | - * from the Spring context. It is optional and usually used with Spring | |
| 44 | - * auto-configuration. | |
| 45 | - */ | |
| 46 | - protected final FunctionCallbackContext functionCallbackContext; | |
| 47 | - | |
| 48 | - public AbstractFunctionCallSupport(FunctionCallbackContext functionCallbackContext) { | |
| 49 | - this.functionCallbackContext = functionCallbackContext; | |
| 50 | - } | |
| 51 | - | |
| 52 | - public Map<String, FunctionCallback> getFunctionCallbackRegister() { | |
| 53 | - return this.functionCallbackRegister; | |
| 54 | - } | |
| 55 | - | |
| 56 | - protected Set<String> handleFunctionCallbackConfigurations(FunctionCallingOptions options, boolean isRuntimeCall) { | |
| 57 | - | |
| 58 | - Set<String> functionToCall = new HashSet<>(); | |
| 59 | - | |
| 60 | - if (options != null) { | |
| 61 | - if (!CollectionUtils.isEmpty(options.getFunctionCallbacks())) { | |
| 62 | - options.getFunctionCallbacks().stream().forEach(functionCallback -> { | |
| 63 | - | |
| 64 | - // Register the tool callback. | |
| 65 | - if (isRuntimeCall) { | |
| 66 | - this.functionCallbackRegister.put(functionCallback.getName(), functionCallback); | |
| 67 | - } | |
| 68 | - else { | |
| 69 | - this.functionCallbackRegister.putIfAbsent(functionCallback.getName(), functionCallback); | |
| 70 | - } | |
| 71 | - | |
| 72 | - // Automatically enable the function, usually from prompt callback. | |
| 73 | - if (isRuntimeCall) { | |
| 74 | - functionToCall.add(functionCallback.getName()); | |
| 75 | - } | |
| 76 | - }); | |
| 77 | - } | |
| 78 | - | |
| 79 | - // Add the explicitly enabled functions. | |
| 80 | - if (!CollectionUtils.isEmpty(options.getFunctions())) { | |
| 81 | - functionToCall.addAll(options.getFunctions()); | |
| 82 | - } | |
| 83 | - } | |
| 84 | - | |
| 85 | - return functionToCall; | |
| 86 | - } | |
| 87 | - | |
| 88 | - /** | |
| 89 | - * Resolve the function callbacks by name. Retrieve them from the registry or try to | |
| 90 | - * resolve them from the Application Context. | |
| 91 | - * @param functionNames Name of function callbacks to retrieve. | |
| 92 | - * @return list of resolved FunctionCallbacks. | |
| 93 | - */ | |
| 94 | - protected List<FunctionCallback> resolveFunctionCallbacks(Set<String> functionNames) { | |
| 95 | - | |
| 96 | - List<FunctionCallback> retrievedFunctionCallbacks = new ArrayList<>(); | |
| 97 | - | |
| 98 | - for (String functionName : functionNames) { | |
| 99 | - if (!this.functionCallbackRegister.containsKey(functionName)) { | |
| 100 | - | |
| 101 | - if (this.functionCallbackContext != null) { | |
| 102 | - FunctionCallback functionCallback = this.functionCallbackContext.getFunctionCallback(functionName, | |
| 103 | - null); | |
| 104 | - if (functionCallback != null) { | |
| 105 | - this.functionCallbackRegister.put(functionName, functionCallback); | |
| 106 | - } | |
| 107 | - else { | |
| 108 | - throw new IllegalStateException( | |
| 109 | - "No function callback [" + functionName + "] fund in tht FunctionCallbackContext"); | |
| 110 | - } | |
| 111 | - } | |
| 112 | - else { | |
| 113 | - throw new IllegalStateException("No function callback found for name: " + functionName); | |
| 114 | - } | |
| 115 | - } | |
| 116 | - FunctionCallback functionCallback = this.functionCallbackRegister.get(functionName); | |
| 117 | - | |
| 118 | - retrievedFunctionCallbacks.add(functionCallback); | |
| 119 | - } | |
| 120 | - | |
| 121 | - return retrievedFunctionCallbacks; | |
| 122 | - } | |
| 123 | - | |
| 124 | - /// | |
| 125 | - protected Resp callWithFunctionSupport(Req request) { | |
| 126 | - Resp response = this.doChatCompletion(request); | |
| 127 | - return this.handleFunctionCallOrReturn(request, response); | |
| 128 | - } | |
| 129 | - | |
| 130 | - protected Resp handleFunctionCallOrReturn(Req request, Resp response) { | |
| 131 | - | |
| 132 | - if (!this.isToolFunctionCall(response)) { | |
| 133 | - return response; | |
| 134 | - } | |
| 135 | - | |
| 136 | - // The chat completion tool call requires the complete conversation | |
| 137 | - // history. Including the initial user message. | |
| 138 | - List<Msg> conversationHistory = new ArrayList<>(); | |
| 139 | - | |
| 140 | - conversationHistory.addAll(this.doGetUserMessages(request)); | |
| 141 | - | |
| 142 | - Msg responseMessage = this.doGetToolResponseMessage(response); | |
| 143 | - | |
| 144 | - // Add the assistant response to the message conversation history. | |
| 145 | - conversationHistory.add(responseMessage); | |
| 146 | - | |
| 147 | - Req newRequest = this.doCreateToolResponseRequest(request, responseMessage, conversationHistory); | |
| 148 | - | |
| 149 | - return this.callWithFunctionSupport(newRequest); | |
| 150 | - } | |
| 151 | - | |
| 152 | - abstract protected Req doCreateToolResponseRequest(Req previousRequest, Msg responseMessage, | |
| 153 | - List<Msg> conversationHistory); | |
| 154 | - | |
| 155 | - abstract protected List<Msg> doGetUserMessages(Req request); | |
| 156 | - | |
| 157 | - abstract protected Msg doGetToolResponseMessage(Resp response); | |
| 158 | - | |
| 159 | - abstract protected Resp doChatCompletion(Req request); | |
| 160 | - | |
| 161 | - abstract protected boolean isToolFunctionCall(Resp response); | |
| 162 | - | |
| 163 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/function/AbstractFunctionCallback.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model.function; | |
| 18 | - | |
| 19 | -import com.fasterxml.jackson.core.JsonProcessingException; | |
| 20 | -import com.fasterxml.jackson.databind.ObjectMapper; | |
| 21 | -import org.springframework.util.Assert; | |
| 22 | - | |
| 23 | -import java.util.function.Function; | |
| 24 | - | |
| 25 | -/** | |
| 26 | - * Abstract implementation of the {@link FunctionCallback} for interacting with the | |
| 27 | - * Model's function calling protocol and a {@link Function} wrapping the interaction with | |
| 28 | - * the 3rd party service/function. | |
| 29 | - * | |
| 30 | - * Implement the {@code O apply(I request) } method to implement the interaction with the | |
| 31 | - * 3rd party service/function. | |
| 32 | - * | |
| 33 | - * The {@link #responseConverter} function is responsible to convert the 3rd party | |
| 34 | - * function's output type into a string expected by the LLM model. | |
| 35 | - * | |
| 36 | - * @param <I> the 3rd party service input type. | |
| 37 | - * @param <O> the 3rd party service output type. | |
| 38 | - * @author Christian Tzolov | |
| 39 | - */ | |
| 40 | -abstract class AbstractFunctionCallback<I, O> implements Function<I, O>, FunctionCallback { | |
| 41 | - | |
| 42 | - private final String name; | |
| 43 | - | |
| 44 | - private final String description; | |
| 45 | - | |
| 46 | - private final Class<I> inputType; | |
| 47 | - | |
| 48 | - private final String inputTypeSchema; | |
| 49 | - | |
| 50 | - private final ObjectMapper objectMapper; | |
| 51 | - | |
| 52 | - private final Function<O, String> responseConverter; | |
| 53 | - | |
| 54 | - /** | |
| 55 | - * Constructs a new {@link AbstractFunctionCallback} with the given name, description, | |
| 56 | - * input type and default object mapper. | |
| 57 | - * @param name Function name. Should be unique within the ChatClient's function | |
| 58 | - * registry. | |
| 59 | - * @param description Function description. Used as a "system prompt" by the model to | |
| 60 | - * decide if the function should be called. | |
| 61 | - * @param inputTypeSchema Used to compute, the argument's Schema (such as JSON Schema | |
| 62 | - * or OpenAPI Schema)required by the Model's function calling protocol. | |
| 63 | - * @param inputType Used to compute, the argument's JSON schema required by the | |
| 64 | - * Model's function calling protocol. | |
| 65 | - * @param responseConverter Used to convert the function's output type to a string. | |
| 66 | - * @param objectMapper Used to convert the function's input and output types to and | |
| 67 | - * from JSON. | |
| 68 | - */ | |
| 69 | - protected AbstractFunctionCallback(String name, String description, String inputTypeSchema, Class<I> inputType, | |
| 70 | - Function<O, String> responseConverter, ObjectMapper objectMapper) { | |
| 71 | - Assert.notNull(name, "Name must not be null"); | |
| 72 | - Assert.notNull(description, "Description must not be null"); | |
| 73 | - Assert.notNull(inputType, "InputType must not be null"); | |
| 74 | - Assert.notNull(inputTypeSchema, "InputTypeSchema must not be null"); | |
| 75 | - Assert.notNull(responseConverter, "ResponseConverter must not be null"); | |
| 76 | - Assert.notNull(objectMapper, "ObjectMapper must not be null"); | |
| 77 | - this.name = name; | |
| 78 | - this.description = description; | |
| 79 | - this.inputType = inputType; | |
| 80 | - this.inputTypeSchema = inputTypeSchema; | |
| 81 | - this.responseConverter = responseConverter; | |
| 82 | - this.objectMapper = objectMapper; | |
| 83 | - } | |
| 84 | - | |
| 85 | - @Override | |
| 86 | - public String getName() { | |
| 87 | - return this.name; | |
| 88 | - } | |
| 89 | - | |
| 90 | - @Override | |
| 91 | - public String getDescription() { | |
| 92 | - return this.description; | |
| 93 | - } | |
| 94 | - | |
| 95 | - @Override | |
| 96 | - public String getInputTypeSchema() { | |
| 97 | - return this.inputTypeSchema; | |
| 98 | - } | |
| 99 | - | |
| 100 | - @Override | |
| 101 | - public String call(String functionArguments) { | |
| 102 | - | |
| 103 | - // Convert the tool calls JSON arguments into a Java function request object. | |
| 104 | - I request = fromJson(functionArguments, inputType); | |
| 105 | - | |
| 106 | - // extend conversation with function response. | |
| 107 | - return this.andThen(this.responseConverter).apply(request); | |
| 108 | - } | |
| 109 | - | |
| 110 | - private <T> T fromJson(String json, Class<T> targetClass) { | |
| 111 | - try { | |
| 112 | - return this.objectMapper.readValue(json, targetClass); | |
| 113 | - } | |
| 114 | - catch (JsonProcessingException e) { | |
| 115 | - throw new RuntimeException(e); | |
| 116 | - } | |
| 117 | - } | |
| 118 | - | |
| 119 | - @Override | |
| 120 | - public int hashCode() { | |
| 121 | - final int prime = 31; | |
| 122 | - int result = 1; | |
| 123 | - result = prime * result + ((name == null) ? 0 : name.hashCode()); | |
| 124 | - result = prime * result + ((description == null) ? 0 : description.hashCode()); | |
| 125 | - result = prime * result + ((inputType == null) ? 0 : inputType.hashCode()); | |
| 126 | - return result; | |
| 127 | - } | |
| 128 | - | |
| 129 | - @Override | |
| 130 | - public boolean equals(Object obj) { | |
| 131 | - if (this == obj) | |
| 132 | - return true; | |
| 133 | - if (obj == null) | |
| 134 | - return false; | |
| 135 | - if (getClass() != obj.getClass()) | |
| 136 | - return false; | |
| 137 | - AbstractFunctionCallback other = (AbstractFunctionCallback) obj; | |
| 138 | - if (name == null) { | |
| 139 | - if (other.name != null) | |
| 140 | - return false; | |
| 141 | - } | |
| 142 | - else if (!name.equals(other.name)) | |
| 143 | - return false; | |
| 144 | - if (description == null) { | |
| 145 | - if (other.description != null) | |
| 146 | - return false; | |
| 147 | - } | |
| 148 | - else if (!description.equals(other.description)) | |
| 149 | - return false; | |
| 150 | - if (inputType == null) { | |
| 151 | - if (other.inputType != null) | |
| 152 | - return false; | |
| 153 | - } | |
| 154 | - else if (!inputType.equals(other.inputType)) | |
| 155 | - return false; | |
| 156 | - return true; | |
| 157 | - } | |
| 158 | - | |
| 159 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/function/FunctionCallback.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model.function; | |
| 18 | - | |
| 19 | -/** | |
| 20 | - * | |
| 21 | - * 表示模型函数调用处理程序。实现已向注册对触发函数调用的提示进行建模和调用。 | |
| 22 | - * | |
| 23 | - * https://blog.csdn.net/weixin_37546425/article/details/136402740 | |
| 24 | - * | |
| 25 | - * https://www.163.com/dy/article/ICE2S20P05119NPR.html | |
| 26 | - * | |
| 27 | - * Represents a model function call handler. Implementations are registered with the | |
| 28 | - * Models and called on prompts that trigger the function call. | |
| 29 | - * | |
| 30 | - * @author Christian Tzolov | |
| 31 | - */ | |
| 32 | -public interface FunctionCallback { | |
| 33 | - | |
| 34 | - /** | |
| 35 | - * @return Returns the Function name. Unique within the model. | |
| 36 | - */ | |
| 37 | - public String getName(); | |
| 38 | - | |
| 39 | - /** | |
| 40 | - * @return Returns the function description. This description is used by the model do | |
| 41 | - * decide if the function should be called or not. | |
| 42 | - */ | |
| 43 | - public String getDescription(); | |
| 44 | - | |
| 45 | - /** | |
| 46 | - * @return Returns the JSON schema of the function input type. | |
| 47 | - */ | |
| 48 | - public String getInputTypeSchema(); | |
| 49 | - | |
| 50 | - /** | |
| 51 | - * Called when a model detects and triggers a function call. The model is responsible | |
| 52 | - * to pass the function arguments in the pre-configured JSON schema format. | |
| 53 | - * @param functionInput JSON string with the function arguments to be passed to the | |
| 54 | - * function. The arguments are defined as JSON schema usually registered with the the | |
| 55 | - * model. | |
| 56 | - * @return String containing the function call response. | |
| 57 | - */ | |
| 58 | - public String call(String functionInput); | |
| 59 | - | |
| 60 | -} | |
| 61 | 0 | \ No newline at end of file |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/function/FunctionCallbackContext.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | -package org.springframework.ai.model.function; | |
| 17 | - | |
| 18 | -import com.fasterxml.jackson.annotation.JsonClassDescription; | |
| 19 | -import org.springframework.beans.BeansException; | |
| 20 | -import org.springframework.cloud.function.context.catalog.FunctionTypeUtils; | |
| 21 | -import org.springframework.cloud.function.context.config.FunctionContextUtils; | |
| 22 | -import org.springframework.context.ApplicationContext; | |
| 23 | -import org.springframework.context.ApplicationContextAware; | |
| 24 | -import org.springframework.context.annotation.Description; | |
| 25 | -import org.springframework.context.support.GenericApplicationContext; | |
| 26 | -import org.springframework.lang.NonNull; | |
| 27 | -import org.springframework.lang.Nullable; | |
| 28 | -import org.springframework.util.StringUtils; | |
| 29 | - | |
| 30 | -import java.lang.reflect.Type; | |
| 31 | -import java.util.function.Function; | |
| 32 | - | |
| 33 | -/** | |
| 34 | - * A Spring {@link ApplicationContextAware} implementation that provides a way to retrieve | |
| 35 | - * a {@link Function} from the Spring context and wrap it into a {@link FunctionCallback}. | |
| 36 | - * | |
| 37 | - * The name of the function is determined by the bean name. | |
| 38 | - * | |
| 39 | - * The description of the function is determined by the following rules: | |
| 40 | - * <ul> | |
| 41 | - * <li>Provided as a default description</li> | |
| 42 | - * <li>Provided as a {@code @Description} annotation on the bean</li> | |
| 43 | - * <li>Provided as a {@code @JsonClassDescription} annotation on the input class</li> | |
| 44 | - * </ul> | |
| 45 | - * | |
| 46 | - * @author Christian Tzolov | |
| 47 | - * @author Christopher Smith | |
| 48 | - */ | |
| 49 | -public class FunctionCallbackContext implements ApplicationContextAware { | |
| 50 | - | |
| 51 | - private GenericApplicationContext applicationContext; | |
| 52 | - | |
| 53 | - private FunctionCallbackWrapper.Builder.SchemaType schemaType = FunctionCallbackWrapper.Builder.SchemaType.JSON_SCHEMA; | |
| 54 | - | |
| 55 | - public void setSchemaType(FunctionCallbackWrapper.Builder.SchemaType schemaType) { | |
| 56 | - this.schemaType = schemaType; | |
| 57 | - } | |
| 58 | - | |
| 59 | - @Override | |
| 60 | - public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException { | |
| 61 | - this.applicationContext = (GenericApplicationContext) applicationContext; | |
| 62 | - } | |
| 63 | - | |
| 64 | - @SuppressWarnings({ "rawtypes", "unchecked" }) | |
| 65 | - public FunctionCallback getFunctionCallback(@NonNull String beanName, @Nullable String defaultDescription) { | |
| 66 | - | |
| 67 | - Type beanType = FunctionContextUtils.findType(this.applicationContext.getBeanFactory(), beanName); | |
| 68 | - | |
| 69 | - if (beanType == null) { | |
| 70 | - throw new IllegalArgumentException( | |
| 71 | - "Functional bean with name: " + beanName + " does not exist in the context."); | |
| 72 | - } | |
| 73 | - | |
| 74 | - if (!Function.class.isAssignableFrom(FunctionTypeUtils.getRawType(beanType))) { | |
| 75 | - throw new IllegalArgumentException( | |
| 76 | - "Function call Bean must be of type Function. Found: " + beanType.getTypeName()); | |
| 77 | - } | |
| 78 | - | |
| 79 | - Type functionInputType = TypeResolverHelper.getFunctionArgumentType(beanType, 0); | |
| 80 | - | |
| 81 | - Class<?> functionInputClass = FunctionTypeUtils.getRawType(functionInputType); | |
| 82 | - String functionName = beanName; | |
| 83 | - String functionDescription = defaultDescription; | |
| 84 | - | |
| 85 | - if (!StringUtils.hasText(functionDescription)) { | |
| 86 | - // Look for a Description annotation on the bean | |
| 87 | - Description descriptionAnnotation = applicationContext.findAnnotationOnBean(beanName, Description.class); | |
| 88 | - | |
| 89 | - if (descriptionAnnotation != null) { | |
| 90 | - functionDescription = descriptionAnnotation.value(); | |
| 91 | - } | |
| 92 | - | |
| 93 | - if (!StringUtils.hasText(functionDescription)) { | |
| 94 | - // Look for a JsonClassDescription annotation on the input class | |
| 95 | - JsonClassDescription jsonClassDescriptionAnnotation = functionInputClass | |
| 96 | - .getAnnotation(JsonClassDescription.class); | |
| 97 | - if (jsonClassDescriptionAnnotation != null) { | |
| 98 | - functionDescription = jsonClassDescriptionAnnotation.value(); | |
| 99 | - } | |
| 100 | - } | |
| 101 | - | |
| 102 | - if (!StringUtils.hasText(functionDescription)) { | |
| 103 | - throw new IllegalStateException("Could not determine function description." | |
| 104 | - + "Please provide a description either as a default parameter, via @Description annotation on the bean " | |
| 105 | - + "or @JsonClassDescription annotation on the input class."); | |
| 106 | - } | |
| 107 | - } | |
| 108 | - | |
| 109 | - Object bean = this.applicationContext.getBean(beanName); | |
| 110 | - | |
| 111 | - // TODO: 2024/3/16 fansili 适配jdk8 | |
| 112 | - return null; | |
| 113 | -// if (bean instanceof Function<?, ?> function) { | |
| 114 | -// return FunctionCallbackWrapper.builder(function) | |
| 115 | -// .withName(functionName) | |
| 116 | -// .withSchemaType(this.schemaType) | |
| 117 | -// .withDescription(functionDescription) | |
| 118 | -// .withInputType(functionInputClass) | |
| 119 | -// .build(); | |
| 120 | -// } | |
| 121 | -// else { | |
| 122 | -// throw new IllegalArgumentException("Bean must be of type Function"); | |
| 123 | -// } | |
| 124 | - } | |
| 125 | - | |
| 126 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/function/FunctionCallbackWrapper.java deleted
| 1 | -package org.springframework.ai.model.function; | |
| 2 | - | |
| 3 | -import org.springframework.ai.model.ModelOptionsUtils; | |
| 4 | -import com.fasterxml.jackson.databind.DeserializationFeature; | |
| 5 | -import com.fasterxml.jackson.databind.ObjectMapper; | |
| 6 | -import org.springframework.util.Assert; | |
| 7 | - | |
| 8 | -import java.util.function.Function; | |
| 9 | - | |
| 10 | -/** | |
| 11 | - * Note that the underlying function is responsible for converting the output into format | |
| 12 | - * that can be consumed by the Model. The default implementation converts the output into | |
| 13 | - * String before sending it to the Model. Provide a custom function responseConverter | |
| 14 | - * implementation to override this. | |
| 15 | - * | |
| 16 | - */ | |
| 17 | -public class FunctionCallbackWrapper<I, O> extends AbstractFunctionCallback<I, O> { | |
| 18 | - | |
| 19 | - private final Function<I, O> function; | |
| 20 | - | |
| 21 | - private FunctionCallbackWrapper(String name, String description, String inputTypeSchema, Class<I> inputType, | |
| 22 | - Function<O, String> responseConverter, Function<I, O> function) { | |
| 23 | - super(name, description, inputTypeSchema, inputType, responseConverter, | |
| 24 | - new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)); | |
| 25 | - Assert.notNull(function, "Function must not be null"); | |
| 26 | - this.function = function; | |
| 27 | - } | |
| 28 | - | |
| 29 | - @SuppressWarnings("unchecked") | |
| 30 | - private static <I, O> Class<I> resolveInputType(Function<I, O> function) { | |
| 31 | - return (Class<I>) TypeResolverHelper.getFunctionInputClass((Class<Function<I, O>>) function.getClass()); | |
| 32 | - } | |
| 33 | - | |
| 34 | - @Override | |
| 35 | - public O apply(I input) { | |
| 36 | - return this.function.apply(input); | |
| 37 | - } | |
| 38 | - | |
| 39 | - public static <I, O> Builder<I, O> builder(Function<I, O> function) { | |
| 40 | - return new Builder<>(function); | |
| 41 | - } | |
| 42 | - | |
| 43 | - public static class Builder<I, O> { | |
| 44 | - | |
| 45 | - public enum SchemaType { | |
| 46 | - | |
| 47 | - JSON_SCHEMA, OPEN_API_SCHEMA | |
| 48 | - | |
| 49 | - } | |
| 50 | - | |
| 51 | - private String name; | |
| 52 | - | |
| 53 | - private String description; | |
| 54 | - | |
| 55 | - private Class<I> inputType; | |
| 56 | - | |
| 57 | - private final Function<I, O> function; | |
| 58 | - | |
| 59 | - private SchemaType schemaType = SchemaType.JSON_SCHEMA; | |
| 60 | - | |
| 61 | - public Builder(Function<I, O> function) { | |
| 62 | - Assert.notNull(function, "Function must not be null"); | |
| 63 | - this.function = function; | |
| 64 | - } | |
| 65 | - | |
| 66 | - // By default the response is converted to a JSON string. | |
| 67 | - private Function<O, String> responseConverter = (response) -> ModelOptionsUtils.toJsonString(response); | |
| 68 | - | |
| 69 | - private String inputTypeSchema; | |
| 70 | - | |
| 71 | - private ObjectMapper objectMapper = new ObjectMapper() | |
| 72 | - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); | |
| 73 | - | |
| 74 | - public Builder<I, O> withName(String name) { | |
| 75 | - Assert.hasText(name, "Name must not be empty"); | |
| 76 | - this.name = name; | |
| 77 | - return this; | |
| 78 | - } | |
| 79 | - | |
| 80 | - public Builder<I, O> withDescription(String description) { | |
| 81 | - Assert.hasText(description, "Description must not be empty"); | |
| 82 | - this.description = description; | |
| 83 | - return this; | |
| 84 | - } | |
| 85 | - | |
| 86 | - @SuppressWarnings("unchecked") | |
| 87 | - public Builder<I, O> withInputType(Class<?> inputType) { | |
| 88 | - this.inputType = (Class<I>) inputType; | |
| 89 | - return this; | |
| 90 | - } | |
| 91 | - | |
| 92 | - public Builder<I, O> withResponseConverter(Function<O, String> responseConverter) { | |
| 93 | - Assert.notNull(responseConverter, "ResponseConverter must not be null"); | |
| 94 | - this.responseConverter = responseConverter; | |
| 95 | - return this; | |
| 96 | - } | |
| 97 | - | |
| 98 | - public Builder<I, O> withInputTypeSchema(String inputTypeSchema) { | |
| 99 | - Assert.hasText(inputTypeSchema, "InputTypeSchema must not be empty"); | |
| 100 | - this.inputTypeSchema = inputTypeSchema; | |
| 101 | - return this; | |
| 102 | - } | |
| 103 | - | |
| 104 | - public Builder<I, O> withObjectMapper(ObjectMapper objectMapper) { | |
| 105 | - Assert.notNull(objectMapper, "ObjectMapper must not be null"); | |
| 106 | - this.objectMapper = objectMapper; | |
| 107 | - return this; | |
| 108 | - } | |
| 109 | - | |
| 110 | - public Builder<I, O> withSchemaType(SchemaType schemaType) { | |
| 111 | - Assert.notNull(schemaType, "SchemaType must not be null"); | |
| 112 | - this.schemaType = schemaType; | |
| 113 | - return this; | |
| 114 | - } | |
| 115 | - | |
| 116 | - public FunctionCallbackWrapper<I, O> build() { | |
| 117 | - | |
| 118 | - Assert.hasText(this.name, "Name must not be empty"); | |
| 119 | - Assert.hasText(this.description, "Description must not be empty"); | |
| 120 | - // Assert.notNull(this.inputType, "InputType must not be null"); | |
| 121 | - Assert.notNull(this.function, "Function must not be null"); | |
| 122 | - Assert.notNull(this.responseConverter, "ResponseConverter must not be null"); | |
| 123 | - Assert.notNull(this.objectMapper, "ObjectMapper must not be null"); | |
| 124 | - | |
| 125 | - if (this.inputType == null) { | |
| 126 | - this.inputType = resolveInputType(this.function); | |
| 127 | - } | |
| 128 | - | |
| 129 | - if (this.inputTypeSchema == null) { | |
| 130 | - boolean upperCaseTypeValues = this.schemaType == SchemaType.OPEN_API_SCHEMA; | |
| 131 | - this.inputTypeSchema = ModelOptionsUtils.getJsonSchema(this.inputType, upperCaseTypeValues); | |
| 132 | - } | |
| 133 | - | |
| 134 | - return new FunctionCallbackWrapper<>(this.name, this.description, this.inputTypeSchema, this.inputType, | |
| 135 | - this.responseConverter, this.function); | |
| 136 | - } | |
| 137 | - | |
| 138 | - } | |
| 139 | - | |
| 140 | -} | |
| 141 | 0 | \ No newline at end of file |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/function/FunctionCallingOptions.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model.function; | |
| 18 | - | |
| 19 | -import java.util.List; | |
| 20 | -import java.util.Set; | |
| 21 | - | |
| 22 | -/** | |
| 23 | - * @author Christian Tzolov | |
| 24 | - */ | |
| 25 | -public interface FunctionCallingOptions { | |
| 26 | - | |
| 27 | - /** | |
| 28 | - * Function Callbacks to be registered with the ChatClient. For Prompt Options the | |
| 29 | - * functionCallbacks are automatically enabled for the duration of the prompt | |
| 30 | - * execution. For Default Options the FunctionCallbacks are registered but disabled by | |
| 31 | - * default. You have to use "functions" property to list the function names from the | |
| 32 | - * ChatClient registry to be used in the chat completion requests. | |
| 33 | - * @return Return the Function Callbacks to be registered with the ChatClient. | |
| 34 | - */ | |
| 35 | - List<FunctionCallback> getFunctionCallbacks(); | |
| 36 | - | |
| 37 | - /** | |
| 38 | - * Set the Function Callbacks to be registered with the ChatClient. | |
| 39 | - * @param functionCallbacks the Function Callbacks to be registered with the | |
| 40 | - * ChatClient. | |
| 41 | - */ | |
| 42 | - void setFunctionCallbacks(List<FunctionCallback> functionCallbacks); | |
| 43 | - | |
| 44 | - /** | |
| 45 | - * @return List of function names from the ChatClient registry to be used in the next | |
| 46 | - * chat completion requests. | |
| 47 | - */ | |
| 48 | - Set<String> getFunctions(); | |
| 49 | - | |
| 50 | - /** | |
| 51 | - * Set the list of function names from the ChatClient registry to be used in the next | |
| 52 | - * chat completion requests. | |
| 53 | - * @param functions the list of function names from the ChatClient registry to be used | |
| 54 | - * in the next chat completion requests. | |
| 55 | - */ | |
| 56 | - void setFunctions(Set<String> functions); | |
| 57 | - | |
| 58 | - /** | |
| 59 | - * @return Returns FunctionCallingOptionsBuilder to create a new instance of | |
| 60 | - * FunctionCallingOptions. | |
| 61 | - */ | |
| 62 | - public static FunctionCallingOptionsBuilder builder() { | |
| 63 | - return new FunctionCallingOptionsBuilder(); | |
| 64 | - } | |
| 65 | - | |
| 66 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/function/FunctionCallingOptionsBuilder.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model.function; | |
| 18 | - | |
| 19 | -import org.springframework.ai.chat.prompt.ChatOptions; | |
| 20 | -import org.springframework.util.Assert; | |
| 21 | - | |
| 22 | -import java.util.ArrayList; | |
| 23 | -import java.util.HashSet; | |
| 24 | -import java.util.List; | |
| 25 | -import java.util.Set; | |
| 26 | - | |
| 27 | -/** | |
| 28 | - * Builder for {@link FunctionCallingOptions}. Using the {@link FunctionCallingOptions} | |
| 29 | - * permits options portability between different AI providers that support | |
| 30 | - * function-calling. | |
| 31 | - * | |
| 32 | - * @author Christian Tzolov | |
| 33 | - * @since 0.8.1 | |
| 34 | - */ | |
| 35 | -public class FunctionCallingOptionsBuilder { | |
| 36 | - | |
| 37 | - private final PortableFunctionCallingOptions options; | |
| 38 | - | |
| 39 | - public FunctionCallingOptionsBuilder() { | |
| 40 | - this.options = new PortableFunctionCallingOptions(); | |
| 41 | - } | |
| 42 | - | |
| 43 | - public FunctionCallingOptionsBuilder withFunctionCallbacks(List<FunctionCallback> functionCallbacks) { | |
| 44 | - this.options.setFunctionCallbacks(functionCallbacks); | |
| 45 | - return this; | |
| 46 | - } | |
| 47 | - | |
| 48 | - public FunctionCallingOptionsBuilder withFunctionCallback(FunctionCallback functionCallback) { | |
| 49 | - Assert.notNull(functionCallback, "FunctionCallback must not be null"); | |
| 50 | - this.options.getFunctionCallbacks().add(functionCallback); | |
| 51 | - return this; | |
| 52 | - } | |
| 53 | - | |
| 54 | - public FunctionCallingOptionsBuilder withFunctions(Set<String> functions) { | |
| 55 | - this.options.setFunctions(functions); | |
| 56 | - return this; | |
| 57 | - } | |
| 58 | - | |
| 59 | - public FunctionCallingOptionsBuilder withFunction(String function) { | |
| 60 | - Assert.notNull(function, "Function must not be null"); | |
| 61 | - this.options.getFunctions().add(function); | |
| 62 | - return this; | |
| 63 | - } | |
| 64 | - | |
| 65 | - public FunctionCallingOptionsBuilder withTemperature(Float temperature) { | |
| 66 | - this.options.setTemperature(temperature); | |
| 67 | - return this; | |
| 68 | - } | |
| 69 | - | |
| 70 | - public FunctionCallingOptionsBuilder withTopP(Float topP) { | |
| 71 | - this.options.setTopP(topP); | |
| 72 | - return this; | |
| 73 | - } | |
| 74 | - | |
| 75 | - public FunctionCallingOptionsBuilder withTopK(Integer topK) { | |
| 76 | - this.options.setTopK(topK); | |
| 77 | - return this; | |
| 78 | - } | |
| 79 | - | |
| 80 | - public PortableFunctionCallingOptions build() { | |
| 81 | - return this.options; | |
| 82 | - } | |
| 83 | - | |
| 84 | - public static class PortableFunctionCallingOptions implements FunctionCallingOptions, ChatOptions { | |
| 85 | - | |
| 86 | - private List<FunctionCallback> functionCallbacks = new ArrayList<>(); | |
| 87 | - | |
| 88 | - private Set<String> functions = new HashSet<>(); | |
| 89 | - | |
| 90 | - private Float temperature; | |
| 91 | - | |
| 92 | - private Float topP; | |
| 93 | - | |
| 94 | - private Integer topK; | |
| 95 | - | |
| 96 | - @Override | |
| 97 | - public List<FunctionCallback> getFunctionCallbacks() { | |
| 98 | - return this.functionCallbacks; | |
| 99 | - } | |
| 100 | - | |
| 101 | - @Override | |
| 102 | - public void setFunctionCallbacks(List<FunctionCallback> functionCallbacks) { | |
| 103 | - Assert.notNull(functionCallbacks, "FunctionCallbacks must not be null"); | |
| 104 | - this.functionCallbacks = functionCallbacks; | |
| 105 | - } | |
| 106 | - | |
| 107 | - @Override | |
| 108 | - public Set<String> getFunctions() { | |
| 109 | - return this.functions; | |
| 110 | - } | |
| 111 | - | |
| 112 | - @Override | |
| 113 | - public void setFunctions(Set<String> functions) { | |
| 114 | - Assert.notNull(functions, "Functions must not be null"); | |
| 115 | - this.functions = functions; | |
| 116 | - } | |
| 117 | - | |
| 118 | - @Override | |
| 119 | - public Float getTemperature() { | |
| 120 | - return this.temperature; | |
| 121 | - } | |
| 122 | - | |
| 123 | - @Override | |
| 124 | - public void setTemperature(Float temperature) { | |
| 125 | - this.temperature = temperature; | |
| 126 | - } | |
| 127 | - | |
| 128 | - @Override | |
| 129 | - public Float getTopP() { | |
| 130 | - return this.topP; | |
| 131 | - } | |
| 132 | - | |
| 133 | - @Override | |
| 134 | - public void setTopP(Float topP) { | |
| 135 | - this.topP = topP; | |
| 136 | - } | |
| 137 | - | |
| 138 | - @Override | |
| 139 | - public Integer getTopK() { | |
| 140 | - return this.topK; | |
| 141 | - } | |
| 142 | - | |
| 143 | - @Override | |
| 144 | - public void setTopK(Integer topK) { | |
| 145 | - this.topK = topK; | |
| 146 | - } | |
| 147 | - | |
| 148 | - } | |
| 149 | - | |
| 150 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/function/TypeResolverHelper.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2024-2024 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.model.function; | |
| 18 | - | |
| 19 | -import net.jodah.typetools.TypeResolver; | |
| 20 | - | |
| 21 | -import java.lang.reflect.GenericArrayType; | |
| 22 | -import java.lang.reflect.ParameterizedType; | |
| 23 | -import java.lang.reflect.Type; | |
| 24 | -import java.util.function.Function; | |
| 25 | - | |
| 26 | -/** | |
| 27 | - * @author Christian Tzolov | |
| 28 | - */ | |
| 29 | -public class TypeResolverHelper { | |
| 30 | - | |
| 31 | - public static Class<?> getFunctionInputClass(Class<? extends Function<?, ?>> functionClass) { | |
| 32 | - return getFunctionArgumentClass(functionClass, 0); | |
| 33 | - } | |
| 34 | - | |
| 35 | - public static Class<?> getFunctionOutputClass(Class<? extends Function<?, ?>> functionClass) { | |
| 36 | - return getFunctionArgumentClass(functionClass, 1); | |
| 37 | - } | |
| 38 | - | |
| 39 | - public static Class<?> getFunctionArgumentClass(Class<? extends Function<?, ?>> functionClass, int argumentIndex) { | |
| 40 | - Type type = TypeResolver.reify(Function.class, functionClass); | |
| 41 | - | |
| 42 | - var argumentType = type instanceof ParameterizedType | |
| 43 | - ? ((ParameterizedType) type).getActualTypeArguments()[argumentIndex] : Object.class; | |
| 44 | - | |
| 45 | - return toRawClass(argumentType); | |
| 46 | - } | |
| 47 | - | |
| 48 | - public static Type getFunctionInputType(Class<? extends Function<?, ?>> functionClass) { | |
| 49 | - return getFunctionArgumentType(functionClass, 0); | |
| 50 | - } | |
| 51 | - | |
| 52 | - public static Type getFunctionOutputType(Class<? extends Function<?, ?>> functionClass) { | |
| 53 | - return getFunctionArgumentType(functionClass, 1); | |
| 54 | - } | |
| 55 | - | |
| 56 | - public static Type getFunctionArgumentType(Class<? extends Function<?, ?>> functionClass, int argumentIndex) { | |
| 57 | - Type functionType = TypeResolver.reify(Function.class, functionClass); | |
| 58 | - return getFunctionArgumentType(functionType, argumentIndex); | |
| 59 | - } | |
| 60 | - | |
| 61 | - public static Type getFunctionArgumentType(Type functionType, int argumentIndex) { | |
| 62 | - var argumentType = functionType instanceof ParameterizedType | |
| 63 | - ? ((ParameterizedType) functionType).getActualTypeArguments()[argumentIndex] : Object.class; | |
| 64 | - | |
| 65 | - return argumentType; | |
| 66 | - } | |
| 67 | - | |
| 68 | - /** | |
| 69 | - * Effectively converts {@link Type} which could be {@link ParameterizedType} to raw | |
| 70 | - * Class (no generics). | |
| 71 | - * @param type actual {@link Type} instance | |
| 72 | - * @return instance of {@link Class} as raw representation of the provided | |
| 73 | - * {@link Type} | |
| 74 | - */ | |
| 75 | - public static Class<?> toRawClass(Type type) { | |
| 76 | - return type != null | |
| 77 | - ? TypeResolver.resolveRawClass(type instanceof GenericArrayType ? type : TypeResolver.reify(type), null) | |
| 78 | - : null; | |
| 79 | - } | |
| 80 | - | |
| 81 | - // public static void main(String[] args) { | |
| 82 | - // Class<? extends Function<?, ?>> clazz = MockWeatherService.class; | |
| 83 | - // System.out.println(getFunctionInputType(clazz)); | |
| 84 | - | |
| 85 | - // } | |
| 86 | - | |
| 87 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/model/package-info.java deleted
| 1 | -/** | |
| 2 | - * Provides a set of interfaces and classes for a generic API designed to interact with | |
| 3 | - * various AI models. This package includes interfaces for handling AI model calls, | |
| 4 | - * requests, responses, results, and associated metadata. It is designed to offer a | |
| 5 | - * flexible and adaptable framework for interacting with different types of AI models, | |
| 6 | - * abstracting the complexities involved in model invocation and result processing. The | |
| 7 | - * use of generics enhances the API's capability to work with a wide range of models, | |
| 8 | - * ensuring a broad applicability across diverse AI scenarios. | |
| 9 | - * | |
| 10 | - */ | |
| 11 | -package org.springframework.ai.model; | |
| 12 | 0 | \ No newline at end of file |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/midjourney/api/MidjourneyInteractionsApi.java
| 1 | 1 | package org.springframework.ai.models.midjourney.api; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.util.StrUtil; |
| 4 | +import com.alibaba.fastjson.JSON; | |
| 5 | +import com.alibaba.fastjson.JSONObject; | |
| 4 | 6 | import org.springframework.ai.models.midjourney.MidjourneyConfig; |
| 5 | 7 | import org.springframework.ai.models.midjourney.api.req.AttachmentsReq; |
| 6 | 8 | import org.springframework.ai.models.midjourney.api.req.DescribeReq; |
| 7 | 9 | import org.springframework.ai.models.midjourney.api.req.ReRollReq; |
| 8 | 10 | import org.springframework.ai.models.midjourney.api.res.UploadAttachmentsRes; |
| 9 | 11 | import org.springframework.ai.models.midjourney.util.MidjourneyUtil; |
| 10 | -import com.alibaba.fastjson2.JSON; | |
| 11 | -import com.alibaba.fastjson2.JSONObject; | |
| 12 | 12 | import com.google.common.collect.Lists; |
| 13 | 13 | import lombok.extern.slf4j.Slf4j; |
| 14 | 14 | import org.springframework.core.io.FileSystemResource; | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/openai/OpenAiImageApi.java deleted
| 1 | -package org.springframework.ai.models.openai; | |
| 2 | - | |
| 3 | -import cn.hutool.json.JSONUtil; | |
| 4 | -import org.springframework.ai.models.openai.api.OpenAiImageRequest; | |
| 5 | -import org.springframework.ai.models.openai.api.OpenAiImageResponse; | |
| 6 | -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | |
| 7 | -import io.netty.channel.ChannelOption; | |
| 8 | -import lombok.extern.slf4j.Slf4j; | |
| 9 | -import org.apache.http.HttpEntity; | |
| 10 | -import org.apache.http.client.methods.CloseableHttpResponse; | |
| 11 | -import org.apache.http.client.methods.HttpPost; | |
| 12 | -import org.apache.http.entity.StringEntity; | |
| 13 | -import org.apache.http.impl.client.CloseableHttpClient; | |
| 14 | -import org.apache.http.impl.client.HttpClients; | |
| 15 | -import org.apache.http.util.EntityUtils; | |
| 16 | -import org.springframework.http.client.reactive.ReactorClientHttpConnector; | |
| 17 | -import org.springframework.web.reactive.function.client.WebClient; | |
| 18 | -import reactor.netty.http.client.HttpClient; | |
| 19 | - | |
| 20 | -import java.io.IOException; | |
| 21 | -import java.net.URI; | |
| 22 | -import java.time.Duration; | |
| 23 | - | |
| 24 | -/** | |
| 25 | - * open ai image | |
| 26 | - * <p> | |
| 27 | - * author: fansili | |
| 28 | - * time: 2024/3/17 09:53 | |
| 29 | - */ | |
| 30 | -@Slf4j | |
| 31 | -public class OpenAiImageApi { | |
| 32 | - | |
| 33 | - private static final String DEFAULT_BASE_URL = "https://api.openai.com"; | |
| 34 | - private String apiKey = "your-api-key"; | |
| 35 | - // 发送请求 webClient | |
| 36 | - private final WebClient webClient; | |
| 37 | - | |
| 38 | - private CloseableHttpClient httpclient = HttpClients.createDefault(); | |
| 39 | - | |
| 40 | - public OpenAiImageApi(String apiKey) { | |
| 41 | - this.apiKey = apiKey; | |
| 42 | - // 创建一个HttpClient实例并设置超时 | |
| 43 | - HttpClient httpClient = HttpClient.create() | |
| 44 | - .responseTimeout(Duration.ofSeconds(300)) // 设置响应超时时间为30秒 | |
| 45 | - .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000 * 100); // 设置连接超时为5秒 | |
| 46 | - this.webClient = WebClient.builder() | |
| 47 | - .baseUrl(DEFAULT_BASE_URL) | |
| 48 | - .clientConnector(new ReactorClientHttpConnector(httpClient)) | |
| 49 | - .build(); | |
| 50 | - } | |
| 51 | - | |
| 52 | - public OpenAiImageResponse createImage(OpenAiImageRequest request) { | |
| 53 | - HttpPost httpPost = new HttpPost(); | |
| 54 | - httpPost.setURI(URI.create(DEFAULT_BASE_URL.concat("/v1/images/generations"))); | |
| 55 | - httpPost.setHeader("Content-Type", "application/json"); | |
| 56 | - httpPost.setHeader("Authorization", "Bearer " + apiKey); | |
| 57 | - httpPost.setEntity(new StringEntity(JsonUtils.toJsonString(request), "UTF-8")); | |
| 58 | - | |
| 59 | - CloseableHttpResponse response= null; | |
| 60 | - try { | |
| 61 | - response = httpclient.execute(httpPost); | |
| 62 | - HttpEntity entity = response.getEntity(); | |
| 63 | - String resultJson = EntityUtils.toString(entity); | |
| 64 | - log.info("openai 图片生成结果: {}", resultJson); | |
| 65 | - return JSONUtil.toBean(resultJson, OpenAiImageResponse.class); | |
| 66 | - } catch (IOException e) { | |
| 67 | - throw new RuntimeException(e); | |
| 68 | - } finally { | |
| 69 | - if (response != null) { | |
| 70 | - try { | |
| 71 | - response.close(); | |
| 72 | - } catch (IOException e) { | |
| 73 | - throw new RuntimeException(e); | |
| 74 | - } | |
| 75 | - } | |
| 76 | - } | |
| 77 | -// String res = webClient.post() | |
| 78 | -// .uri(uriBuilder -> uriBuilder.path("/v1/images/generations").build()) | |
| 79 | -// .header("Content-Type", "application/json") | |
| 80 | -// .header("Authorization", "Bearer " + apiKey) | |
| 81 | -// // 设置请求体(这里假设jsonStr是一个JSON格式的字符串) | |
| 82 | -// .body(BodyInserters.fromValue(JacksonUtil.toJson(request))) | |
| 83 | -// // 发送请求并获取响应体 | |
| 84 | -// .retrieve() | |
| 85 | -// // 转换响应体为String类型 | |
| 86 | -// .bodyToMono(String.class) | |
| 87 | -// .block(); | |
| 88 | - } | |
| 89 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/openai/OpenAiImageClient.java deleted
| 1 | -package org.springframework.ai.models.openai; | |
| 2 | - | |
| 3 | -import cn.hutool.core.bean.BeanUtil; | |
| 4 | -import cn.hutool.core.codec.Base64; | |
| 5 | -import cn.hutool.core.util.StrUtil; | |
| 6 | -import cn.hutool.http.HttpUtil; | |
| 7 | -import org.springframework.ai.chat.ChatException; | |
| 8 | -import org.springframework.ai.models.yiyan.exception.YiYanApiException; | |
| 9 | -import cn.iocoder.yudao.framework.ai.core.exception.AiException; | |
| 10 | -import org.springframework.ai.models.openai.api.OpenAiImageRequest; | |
| 11 | -import org.springframework.ai.models.openai.api.OpenAiImageResponse; | |
| 12 | -import lombok.extern.slf4j.Slf4j; | |
| 13 | -import org.jetbrains.annotations.NotNull; | |
| 14 | -import org.springframework.ai.image.*; | |
| 15 | -import org.springframework.retry.RetryCallback; | |
| 16 | -import org.springframework.retry.RetryContext; | |
| 17 | -import org.springframework.retry.RetryListener; | |
| 18 | -import org.springframework.retry.support.RetryTemplate; | |
| 19 | - | |
| 20 | -import java.time.Duration; | |
| 21 | - | |
| 22 | -/** | |
| 23 | - * open ai 生成 image | |
| 24 | - * | |
| 25 | - * author: fansili | |
| 26 | - * time: 2024/3/17 09:51 | |
| 27 | - */ | |
| 28 | -@Slf4j | |
| 29 | -public class OpenAiImageClient implements ImageClient { | |
| 30 | - | |
| 31 | - /** | |
| 32 | - * open image ai | |
| 33 | - */ | |
| 34 | - private OpenAiImageApi openAiImageApi; | |
| 35 | - /** | |
| 36 | - * 默认使用的 ImageOptions | |
| 37 | - */ | |
| 38 | - private OpenAiImageOptions defaultImageOptions; | |
| 39 | - | |
| 40 | - | |
| 41 | - public final RetryTemplate retryTemplate = RetryTemplate.builder() | |
| 42 | - // 最大重试次数 10 | |
| 43 | - .maxAttempts(10) | |
| 44 | - .retryOn(YiYanApiException.class) | |
| 45 | - // 最大重试5次,第一次间隔3000ms,第二次3000ms * 2,第三次3000ms * 3,以此类推,最大间隔3 * 60000ms | |
| 46 | - .exponentialBackoff(Duration.ofMillis(3000), 2, Duration.ofMillis(3 * 60000)) | |
| 47 | - .withListener(new RetryListener() { | |
| 48 | - @Override | |
| 49 | - public <T extends Object, E extends Throwable> void onError(RetryContext context, | |
| 50 | - RetryCallback<T, E> callback, Throwable throwable) { | |
| 51 | - log.warn("重试异常:" + context.getRetryCount(), throwable); | |
| 52 | - }; | |
| 53 | - }) | |
| 54 | - .build(); | |
| 55 | - | |
| 56 | - public OpenAiImageClient(OpenAiImageApi openAiImageApi, OpenAiImageOptions defaultImageOptions) { | |
| 57 | - this.openAiImageApi = openAiImageApi; | |
| 58 | - this.defaultImageOptions = defaultImageOptions; | |
| 59 | - } | |
| 60 | - | |
| 61 | - @Override | |
| 62 | - public ImageResponse call(ImagePrompt imagePrompt) { | |
| 63 | - return this.retryTemplate.execute(ctx -> { | |
| 64 | - OpenAiImageOptions openAiImageOptions = getOpenAiImageOptions(imagePrompt); | |
| 65 | - // 创建请求 | |
| 66 | - OpenAiImageRequest request = new OpenAiImageRequest(); | |
| 67 | - BeanUtil.copyProperties(openAiImageOptions, request); | |
| 68 | - request.setPrompt(imagePrompt.getInstructions().get(0).getText()); | |
| 69 | - request.setModel(openAiImageOptions.getModel()); | |
| 70 | - request.setStyle(openAiImageOptions.getStyle().getStyle()); | |
| 71 | - request.setSize(openAiImageOptions.getSize()); | |
| 72 | - // 发送请求 | |
| 73 | - OpenAiImageResponse response = openAiImageApi.createImage(request); | |
| 74 | - if (response.getError() != null && !StrUtil.isBlank(response.getError().getMessage())) { | |
| 75 | - // code 错误没有编码,就先根据 message 来进行判断 | |
| 76 | - throw new AiException("openAi 图片生成失败! " + response.getError().getMessage()); | |
| 77 | - } | |
| 78 | - return new ImageResponse(response.getData().stream().map(res -> { | |
| 79 | - byte[] bytes = HttpUtil.downloadBytes(res.getUrl()); | |
| 80 | - String base64 = Base64.encode(bytes); | |
| 81 | - return new ImageGeneration(new Image(res.getUrl(), base64)); | |
| 82 | - }).toList()); | |
| 83 | - }); | |
| 84 | - } | |
| 85 | - | |
| 86 | - private @NotNull OpenAiImageOptions getOpenAiImageOptions(ImagePrompt imagePrompt) { | |
| 87 | - // 检查是否配置了 OpenAiImageOptions | |
| 88 | - if (defaultImageOptions == null && imagePrompt.getOptions() == null) { | |
| 89 | - throw new ChatException("OpenAiImageOptions 未配置参数!"); | |
| 90 | - } | |
| 91 | - // 优先使用 request 中的 ImageOptions | |
| 92 | - ImageOptions useImageOptions = imagePrompt.getOptions() == null ? defaultImageOptions : imagePrompt.getOptions(); | |
| 93 | - if (!(useImageOptions instanceof OpenAiImageOptions)) { | |
| 94 | - throw new ChatException("配置信息不正确,传入的必须是 OpenAiImageOptions!"); | |
| 95 | - } | |
| 96 | - // 转换 OpenAiImageOptions | |
| 97 | - OpenAiImageOptions openAiImageOptions = (OpenAiImageOptions) useImageOptions; | |
| 98 | - return openAiImageOptions; | |
| 99 | - } | |
| 100 | - | |
| 101 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/openai/OpenAiImageOptions.java deleted
| 1 | -package org.springframework.ai.models.openai; | |
| 2 | - | |
| 3 | -import org.springframework.ai.image.ImageOptions; | |
| 4 | -import org.springframework.ai.models.openai.enums.OpenAiImageModelEnum; | |
| 5 | -import org.springframework.ai.models.openai.enums.OpenAiImageStyleEnum; | |
| 6 | -import lombok.Data; | |
| 7 | -import lombok.Getter; | |
| 8 | -import lombok.experimental.Accessors; | |
| 9 | - | |
| 10 | -/** | |
| 11 | - * open ai 配置文件 | |
| 12 | - * | |
| 13 | - * 文档地址:https://platform.openai.com/docs/api-reference/images/create | |
| 14 | - * | |
| 15 | - * author: fansili | |
| 16 | - * time: 2024/3/17 09:53 | |
| 17 | - */ | |
| 18 | -@Data | |
| 19 | -@Accessors(chain = true) | |
| 20 | -public class OpenAiImageOptions implements ImageOptions { | |
| 21 | - | |
| 22 | - // 必填字段,用于描述期望生成图像的文字说明。对于dall-e-2模型最大长度为1000个字符,对于dall-e-3模型最大长度为4000个字符。 | |
| 23 | - private String prompt; | |
| 24 | - | |
| 25 | - // 可选字段,默认为dall-e-2 | |
| 26 | - // 指定用于生成图像的模型名称。 | |
| 27 | - private OpenAiImageModelEnum model = OpenAiImageModelEnum.DALL_E_2; | |
| 28 | - | |
| 29 | - // 可选字段,默认为1 | |
| 30 | - // 生成图像的数量,必须在1到10之间。对于dall-e-3模型,目前仅支持n=1。 | |
| 31 | - private Integer n = 1; | |
| 32 | - | |
| 33 | - // 可选字段,默认为standard | |
| 34 | - // 设置生成图像的质量。hd质量将创建细节更丰富、图像整体一致性更高的图片。该参数仅对dall-e-3模型有效。 | |
| 35 | - private String quality = "standard"; | |
| 36 | - | |
| 37 | - // 可选字段,默认为url | |
| 38 | - // 返回生成图像的格式。必须是url或b64_json中的一种。URL链接的有效期是从生成图像后开始计算的60分钟内有效。 | |
| 39 | - private String responseFormat = "url"; | |
| 40 | - | |
| 41 | - // 可选字段,默认为1024x1024 | |
| 42 | - // 生成图像的尺寸大小。对于dall-e-2模型,尺寸可为256x256, 512x512, 或 1024x1024。对于dall-e-3模型,尺寸可为1024x1024, 1792x1024, 或 1024x1792。 | |
| 43 | - private String size = "1024x1024"; | |
| 44 | - | |
| 45 | - // 可选字段,默认为vivid | |
| 46 | - // 图像生成的风格。可为vivid(生动)或natural(自然)。vivid会使模型偏向生成超现实和戏剧性的图像,而natural则会让模型产出更自然、不那么超现实的图像。该参数仅对dall-e-3模型有效。 | |
| 47 | - private OpenAiImageStyleEnum style = OpenAiImageStyleEnum.VIVID; | |
| 48 | - | |
| 49 | - // 可选字段 | |
| 50 | - // 代表您的终端用户的唯一标识符,有助于OpenAI监控并检测滥用行为。了解更多信息请参考官方文档。 | |
| 51 | - private String endUserId = "UID123456"; | |
| 52 | - | |
| 53 | - @Getter | |
| 54 | - public enum ResponseFormatEnum { | |
| 55 | - | |
| 56 | - URL("url"), | |
| 57 | - BASE64("b64_json"), | |
| 58 | - | |
| 59 | - ; | |
| 60 | - | |
| 61 | - ResponseFormatEnum(String value) { | |
| 62 | - this.value = value; | |
| 63 | - } | |
| 64 | - | |
| 65 | - private String value; | |
| 66 | - } | |
| 67 | - | |
| 68 | - // | |
| 69 | - // 适配 spring ai | |
| 70 | - | |
| 71 | - @Override | |
| 72 | - public Integer getN() { | |
| 73 | - return this.n; | |
| 74 | - } | |
| 75 | - | |
| 76 | - @Override | |
| 77 | - public String getModel() { | |
| 78 | - return this.model.getModel(); | |
| 79 | - } | |
| 80 | - | |
| 81 | - @Override | |
| 82 | - public Integer getWidth() { | |
| 83 | - return null; | |
| 84 | - } | |
| 85 | - | |
| 86 | - @Override | |
| 87 | - public Integer getHeight() { | |
| 88 | - return null; | |
| 89 | - } | |
| 90 | - | |
| 91 | - @Override | |
| 92 | - public String getResponseFormat() { | |
| 93 | - return this.responseFormat; | |
| 94 | - } | |
| 95 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/openai/api/OpenAiImageRequest.java deleted
| 1 | -package org.springframework.ai.models.openai.api; | |
| 2 | - | |
| 3 | -import com.fasterxml.jackson.annotation.JsonProperty; | |
| 4 | -import lombok.Data; | |
| 5 | -import lombok.experimental.Accessors; | |
| 6 | - | |
| 7 | -/** | |
| 8 | - * open ai 配置文件 | |
| 9 | - * | |
| 10 | - * 文档地址:https://platform.openai.com/docs/api-reference/images/create | |
| 11 | - * | |
| 12 | - * author: fansili | |
| 13 | - * time: 2024/3/17 09:53 | |
| 14 | - */ | |
| 15 | -@Data | |
| 16 | -@Accessors(chain = true) | |
| 17 | -public class OpenAiImageRequest { | |
| 18 | - | |
| 19 | - // 必填字段,用于描述期望生成图像的文字说明。对于dall-e-2模型最大长度为1000个字符,对于dall-e-3模型最大长度为4000个字符。 | |
| 20 | - @JsonProperty("prompt") | |
| 21 | - private String prompt; | |
| 22 | - | |
| 23 | - // 可选字段,默认为dall-e-2、dall-e-3 | |
| 24 | - // 指定用于生成图像的模型名称。 | |
| 25 | - @JsonProperty("model") | |
| 26 | - private String model = "dall-e-2"; | |
| 27 | - | |
| 28 | - // 可选字段,默认为1 | |
| 29 | - // 生成图像的数量,必须在1到10之间。对于dall-e-3模型,目前仅支持n=1。 | |
| 30 | - @JsonProperty("n") | |
| 31 | - private Integer n = 1; | |
| 32 | - | |
| 33 | - // 可选字段,默认为standard | |
| 34 | - // 设置生成图像的质量。hd质量将创建细节更丰富、图像整体一致性更高的图片。该参数仅对dall-e-3模型有效。 | |
| 35 | - @JsonProperty("quality") | |
| 36 | - private String quality = "standard"; | |
| 37 | - | |
| 38 | - // 可选字段,默认为url | |
| 39 | - // 返回生成图像的格式。必须是url或b64_json中的一种。URL链接的有效期是从生成图像后开始计算的60分钟内有效。 | |
| 40 | - @JsonProperty("response_format") | |
| 41 | - private String responseFormat = "url"; | |
| 42 | - | |
| 43 | - // 可选字段,默认为1024x1024 | |
| 44 | - // 生成图像的尺寸大小。对于dall-e-2模型,尺寸可为256x256, 512x512, 或 1024x1024。对于dall-e-3模型,尺寸可为1024x1024, 1792x1024, 或 1024x1792。 | |
| 45 | - @JsonProperty("size") | |
| 46 | - private String size = "1024x1024"; | |
| 47 | - | |
| 48 | - // 可选字段,默认为vivid | |
| 49 | - // 图像生成的风格。可为vivid(生动)或natural(自然)。vivid会使模型偏向生成超现实和戏剧性的图像,而natural则会让模型产出更自然、不那么超现实的图像。该参数仅对dall-e-3模型有效。 | |
| 50 | - @JsonProperty("style") | |
| 51 | - private String style = "vivid"; | |
| 52 | - | |
| 53 | - // 可选字段 | |
| 54 | - // 代表您的终端用户的唯一标识符,有助于OpenAI监控并检测滥用行为。了解更多信息请参考官方文档。 | |
| 55 | - @JsonProperty("user") | |
| 56 | - private String endUserId = "UID123123"; | |
| 57 | - | |
| 58 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/openai/api/OpenAiImageResponse.java deleted
| 1 | -package org.springframework.ai.models.openai.api; | |
| 2 | - | |
| 3 | -import lombok.Data; | |
| 4 | -import lombok.experimental.Accessors; | |
| 5 | - | |
| 6 | -import java.util.List; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * image 返回 | |
| 10 | - * | |
| 11 | - * author: fansili | |
| 12 | - * time: 2024/3/17 10:27 | |
| 13 | - */ | |
| 14 | -@Data | |
| 15 | -@Accessors(chain = true) | |
| 16 | -public class OpenAiImageResponse { | |
| 17 | - | |
| 18 | - private long created; | |
| 19 | - private List<Item> data; | |
| 20 | - private Error error; | |
| 21 | - | |
| 22 | - @Data | |
| 23 | - @Accessors(chain = true) | |
| 24 | - public static class Item { | |
| 25 | - | |
| 26 | - private String url; | |
| 27 | - private String b64_json; | |
| 28 | - | |
| 29 | - } | |
| 30 | - | |
| 31 | - @Data | |
| 32 | - @Accessors(chain = true) | |
| 33 | - public static class Error { | |
| 34 | - private String code; | |
| 35 | - private String message; | |
| 36 | - private String param; | |
| 37 | - private String type; | |
| 38 | - } | |
| 39 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/tongyi/QianWenChatClient.java
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/tongyi/QianWenOptions.java
| ... | ... | @@ -41,25 +41,25 @@ public class QianWenOptions implements ChatOptions { |
| 41 | 41 | return null; |
| 42 | 42 | } |
| 43 | 43 | |
| 44 | - @Override | |
| 45 | - public void setTemperature(Float temperature) { | |
| 46 | - | |
| 47 | - } | |
| 48 | - | |
| 49 | - @Override | |
| 50 | - public void setTopP(Float topP) { | |
| 51 | - this.topP = topP; | |
| 52 | - } | |
| 44 | +// @Override | |
| 45 | +// public void setTemperature(Float temperature) { | |
| 46 | +// | |
| 47 | +// } | |
| 48 | +// | |
| 49 | +// @Override | |
| 50 | +// public void setTopP(Float topP) { | |
| 51 | +// this.topP = topP; | |
| 52 | +// } | |
| 53 | 53 | |
| 54 | 54 | @Override |
| 55 | 55 | public Integer getTopK() { |
| 56 | 56 | return null; |
| 57 | 57 | } |
| 58 | 58 | |
| 59 | - @Override | |
| 60 | - public void setTopK(Integer topK) { | |
| 61 | - | |
| 62 | - } | |
| 59 | +// @Override | |
| 60 | +// public void setTopK(Integer topK) { | |
| 61 | +// | |
| 62 | +// } | |
| 63 | 63 | |
| 64 | 64 | @Data |
| 65 | 65 | @Accessors | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/xinghuo/XingHuoChatClient.java
| ... | ... | @@ -2,6 +2,7 @@ package org.springframework.ai.models.xinghuo; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.bean.BeanUtil; |
| 4 | 4 | import cn.hutool.core.exceptions.ExceptionUtil; |
| 5 | +import cn.iocoder.yudao.framework.ai.core.exception.ChatException; | |
| 5 | 6 | import org.springframework.ai.chat.*; |
| 6 | 7 | import org.springframework.ai.chat.prompt.ChatOptions; |
| 7 | 8 | import org.springframework.ai.chat.prompt.Prompt; | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/xinghuo/XingHuoOptions.java
| ... | ... | @@ -49,28 +49,29 @@ public class XingHuoOptions implements ChatOptions { |
| 49 | 49 | return this.temperature; |
| 50 | 50 | } |
| 51 | 51 | |
| 52 | - @Override | |
| 53 | - public void setTemperature(Float temperature) { | |
| 54 | - this.temperature = temperature; | |
| 55 | - } | |
| 52 | +// @Override | |
| 53 | +// public void setTemperature(Float temperature) { | |
| 54 | +// this.temperature = temperature; | |
| 55 | +// } | |
| 56 | 56 | |
| 57 | 57 | @Override |
| 58 | 58 | public Float getTopP() { |
| 59 | 59 | return null; |
| 60 | 60 | } |
| 61 | 61 | |
| 62 | - @Override | |
| 63 | - public void setTopP(Float topP) { | |
| 64 | - | |
| 65 | - } | |
| 62 | +// @Override | |
| 63 | +// public void setTopP(Float topP) { | |
| 64 | +// | |
| 65 | +// } | |
| 66 | 66 | |
| 67 | 67 | @Override |
| 68 | 68 | public Integer getTopK() { |
| 69 | 69 | return this.topK; |
| 70 | 70 | } |
| 71 | 71 | |
| 72 | - @Override | |
| 73 | - public void setTopK(Integer topK) { | |
| 74 | - this.topK = topK; | |
| 75 | - } | |
| 72 | +// @Override | |
| 73 | +// public void setTopK(Integer topK) { | |
| 74 | +// this.topK = topK; | |
| 75 | +// } | |
| 76 | + | |
| 76 | 77 | } | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/yiyan/YiYanChatClient.java
| 1 | 1 | package org.springframework.ai.models.yiyan; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.bean.BeanUtil; |
| 4 | +import cn.iocoder.yudao.framework.ai.core.exception.ChatException; | |
| 4 | 5 | import org.springframework.ai.chat.*; |
| 5 | 6 | import org.springframework.ai.chat.messages.Message; |
| 6 | 7 | import org.springframework.ai.chat.messages.MessageType; | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/yiyan/YiYanOptions.java
| ... | ... | @@ -114,20 +114,20 @@ public class YiYanOptions implements ChatOptions { |
| 114 | 114 | return this.temperature; |
| 115 | 115 | } |
| 116 | 116 | |
| 117 | - @Override | |
| 118 | - public void setTemperature(Float temperature) { | |
| 119 | - this.temperature = temperature; | |
| 120 | - } | |
| 117 | +// @Override | |
| 118 | +// public void setTemperature(Float temperature) { | |
| 119 | +// this.temperature = temperature; | |
| 120 | +// } | |
| 121 | 121 | |
| 122 | 122 | @Override |
| 123 | 123 | public Float getTopP() { |
| 124 | 124 | return topP; |
| 125 | 125 | } |
| 126 | 126 | |
| 127 | - @Override | |
| 128 | - public void setTopP(Float topP) { | |
| 129 | - this.topP = topP; | |
| 130 | - } | |
| 127 | +// @Override | |
| 128 | +// public void setTopP(Float topP) { | |
| 129 | +// this.topP = topP; | |
| 130 | +// } | |
| 131 | 131 | |
| 132 | 132 | // 百度么有 topK |
| 133 | 133 | |
| ... | ... | @@ -136,7 +136,7 @@ public class YiYanOptions implements ChatOptions { |
| 136 | 136 | return null; |
| 137 | 137 | } |
| 138 | 138 | |
| 139 | - @Override | |
| 140 | - public void setTopK(Integer topK) { | |
| 141 | - } | |
| 139 | +// @Override | |
| 140 | +// public void setTopK(Integer topK) { | |
| 141 | +// } | |
| 142 | 142 | } | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/parser/AbstractConversionServiceOutputParser.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.parser; | |
| 18 | - | |
| 19 | -import org.springframework.core.convert.support.DefaultConversionService; | |
| 20 | - | |
| 21 | -/** | |
| 22 | - * Abstract {@link OutputParser} implementation that uses a pre-configured | |
| 23 | - * {@link DefaultConversionService} to convert the LLM output into the desired type | |
| 24 | - * format. | |
| 25 | - * | |
| 26 | - * @param <T> Specifies the desired response type. | |
| 27 | - * @author Mark Pollack | |
| 28 | - * @author Christian Tzolov | |
| 29 | - */ | |
| 30 | -public abstract class AbstractConversionServiceOutputParser<T> implements OutputParser<T> { | |
| 31 | - | |
| 32 | - private final DefaultConversionService conversionService; | |
| 33 | - | |
| 34 | - public AbstractConversionServiceOutputParser(DefaultConversionService conversionService) { | |
| 35 | - this.conversionService = conversionService; | |
| 36 | - } | |
| 37 | - | |
| 38 | - public DefaultConversionService getConversionService() { | |
| 39 | - return conversionService; | |
| 40 | - } | |
| 41 | - | |
| 42 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/parser/AbstractMessageConverterOutputParser.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.parser; | |
| 18 | - | |
| 19 | -import org.springframework.messaging.converter.MessageConverter; | |
| 20 | - | |
| 21 | -/** | |
| 22 | - * Abstract {@link OutputParser} implementation that uses a pre-configured | |
| 23 | - * {@link MessageConverter} to convert the LLM output into the desired type format. | |
| 24 | - * | |
| 25 | - * @param <T> Specifies the desired response type. | |
| 26 | - * @author Mark Pollack | |
| 27 | - * @author Christian Tzolov | |
| 28 | - */ | |
| 29 | -public abstract class AbstractMessageConverterOutputParser<T> implements OutputParser<T> { | |
| 30 | - | |
| 31 | - private MessageConverter messageConverter; | |
| 32 | - | |
| 33 | - public AbstractMessageConverterOutputParser(MessageConverter messageConverter) { | |
| 34 | - this.messageConverter = messageConverter; | |
| 35 | - } | |
| 36 | - | |
| 37 | - public MessageConverter getMessageConverter() { | |
| 38 | - return this.messageConverter; | |
| 39 | - } | |
| 40 | - | |
| 41 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/parser/BeanOutputParser.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.parser; | |
| 18 | - | |
| 19 | -import com.fasterxml.jackson.core.JsonProcessingException; | |
| 20 | -import com.fasterxml.jackson.core.util.DefaultIndenter; | |
| 21 | -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; | |
| 22 | -import com.fasterxml.jackson.databind.DeserializationFeature; | |
| 23 | -import com.fasterxml.jackson.databind.JsonNode; | |
| 24 | -import com.fasterxml.jackson.databind.ObjectMapper; | |
| 25 | -import com.fasterxml.jackson.databind.ObjectWriter; | |
| 26 | -import com.github.victools.jsonschema.generator.SchemaGenerator; | |
| 27 | -import com.github.victools.jsonschema.generator.SchemaGeneratorConfig; | |
| 28 | -import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder; | |
| 29 | -import com.github.victools.jsonschema.module.jackson.JacksonModule; | |
| 30 | - | |
| 31 | -import java.util.Map; | |
| 32 | -import java.util.Objects; | |
| 33 | - | |
| 34 | -import static com.github.victools.jsonschema.generator.OptionPreset.PLAIN_JSON; | |
| 35 | -import static com.github.victools.jsonschema.generator.SchemaVersion.DRAFT_2020_12; | |
| 36 | - | |
| 37 | -/** | |
| 38 | - * An implementation of {@link OutputParser} that transforms the LLM output to a specific | |
| 39 | - * object type using JSON schema. This parser works by generating a JSON schema based on a | |
| 40 | - * given Java class, which is then used to validate and transform the LLM output into the | |
| 41 | - * desired type. | |
| 42 | - * | |
| 43 | - * @param <T> The target type to which the output will be converted. | |
| 44 | - * @author Mark Pollack | |
| 45 | - * @author Christian Tzolov | |
| 46 | - * @author Sebastian Ullrich | |
| 47 | - * @author Kirk Lund | |
| 48 | - */ | |
| 49 | -public class BeanOutputParser<T> implements OutputParser<T> { | |
| 50 | - | |
| 51 | - /** Holds the generated JSON schema for the target type. */ | |
| 52 | - private String jsonSchema; | |
| 53 | - | |
| 54 | - /** The Java class representing the target type. */ | |
| 55 | - @SuppressWarnings({ "FieldMayBeFinal", "rawtypes" }) | |
| 56 | - private Class<T> clazz; | |
| 57 | - | |
| 58 | - /** The object mapper used for deserialization and other JSON operations. */ | |
| 59 | - @SuppressWarnings("FieldMayBeFinal") | |
| 60 | - private ObjectMapper objectMapper; | |
| 61 | - | |
| 62 | - /** | |
| 63 | - * Constructor to initialize with the target type's class. | |
| 64 | - * @param clazz The target type's class. | |
| 65 | - */ | |
| 66 | - public BeanOutputParser(Class<T> clazz) { | |
| 67 | - this(clazz, null); | |
| 68 | - } | |
| 69 | - | |
| 70 | - /** | |
| 71 | - * Constructor to initialize with the target type's class, a custom object mapper, and | |
| 72 | - * a line endings normalizer to ensure consistent line endings on any platform. | |
| 73 | - * @param clazz The target type's class. | |
| 74 | - * @param objectMapper Custom object mapper for JSON operations. endings. | |
| 75 | - */ | |
| 76 | - public BeanOutputParser(Class<T> clazz, ObjectMapper objectMapper) { | |
| 77 | - Objects.requireNonNull(clazz, "Java Class cannot be null;"); | |
| 78 | - this.clazz = clazz; | |
| 79 | - this.objectMapper = objectMapper != null ? objectMapper : getObjectMapper(); | |
| 80 | - generateSchema(); | |
| 81 | - } | |
| 82 | - | |
| 83 | - /** | |
| 84 | - * Generates the JSON schema for the target type. | |
| 85 | - */ | |
| 86 | - private void generateSchema() { | |
| 87 | - JacksonModule jacksonModule = new JacksonModule(); | |
| 88 | - SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(DRAFT_2020_12, PLAIN_JSON) | |
| 89 | - .with(jacksonModule); | |
| 90 | - SchemaGeneratorConfig config = configBuilder.build(); | |
| 91 | - SchemaGenerator generator = new SchemaGenerator(config); | |
| 92 | - JsonNode jsonNode = generator.generateSchema(this.clazz); | |
| 93 | - ObjectWriter objectWriter = new ObjectMapper() | |
| 94 | - .writer(new DefaultPrettyPrinter().withObjectIndenter(new DefaultIndenter().withLinefeed("\n"))); | |
| 95 | - try { | |
| 96 | - this.jsonSchema = objectWriter.writeValueAsString(jsonNode); | |
| 97 | - } | |
| 98 | - catch (JsonProcessingException e) { | |
| 99 | - throw new RuntimeException("Could not pretty print json schema for " + this.clazz, e); | |
| 100 | - } | |
| 101 | - } | |
| 102 | - | |
| 103 | - @Override | |
| 104 | - /** | |
| 105 | - * Parses the given text to transform it to the desired target type. | |
| 106 | - * @param text The LLM output in string format. | |
| 107 | - * @return The parsed output in the desired target type. | |
| 108 | - */ | |
| 109 | - public T parse(String text) { | |
| 110 | - try { | |
| 111 | - // If the response is a JSON Schema, extract the properties and use them as | |
| 112 | - // the response. | |
| 113 | - text = this.jsonSchemaToInstance(text); | |
| 114 | - return (T) this.objectMapper.readValue(text, this.clazz); | |
| 115 | - } | |
| 116 | - catch (JsonProcessingException e) { | |
| 117 | - throw new RuntimeException(e); | |
| 118 | - } | |
| 119 | - } | |
| 120 | - | |
| 121 | - /** | |
| 122 | - * Converts a JSON Schema to an instance based on a given text. | |
| 123 | - * @param text The JSON Schema in string format. | |
| 124 | - * @return The JSON instance generated from the JSON Schema, or the original text if | |
| 125 | - * the input is not a JSON Schema. | |
| 126 | - */ | |
| 127 | - private String jsonSchemaToInstance(String text) { | |
| 128 | - try { | |
| 129 | - Map<String, Object> map = this.objectMapper.readValue(text, Map.class); | |
| 130 | - if (map.containsKey("$schema")) { | |
| 131 | - return this.objectMapper.writeValueAsString(map.get("properties")); | |
| 132 | - } | |
| 133 | - } | |
| 134 | - catch (Exception e) { | |
| 135 | - } | |
| 136 | - return text; | |
| 137 | - } | |
| 138 | - | |
| 139 | - /** | |
| 140 | - * Configures and returns an object mapper for JSON operations. | |
| 141 | - * @return Configured object mapper. | |
| 142 | - */ | |
| 143 | - protected ObjectMapper getObjectMapper() { | |
| 144 | - ObjectMapper mapper = new ObjectMapper(); | |
| 145 | - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); | |
| 146 | - return mapper; | |
| 147 | - } | |
| 148 | - | |
| 149 | - /** | |
| 150 | - * Provides the expected format of the response, instructing that it should adhere to | |
| 151 | - * the generated JSON schema. | |
| 152 | - * @return The instruction format string. | |
| 153 | - */ | |
| 154 | - @Override | |
| 155 | - public String getFormat() { | |
| 156 | -// String template = """ | |
| 157 | -// Your response should be in JSON format. | |
| 158 | -// Do not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation. | |
| 159 | -// Do not include markdown code blocks in your response. | |
| 160 | -// Here is the JSON Schema instance your output must adhere to: | |
| 161 | -// ```%s``` | |
| 162 | -// """; | |
| 163 | - String template = "Your response should be in JSON format.\n" + | |
| 164 | - "\t\t\t\tDo not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation.\n" + | |
| 165 | - "\t\t\t\tDo not include markdown code blocks in your response.\n" + | |
| 166 | - "\t\t\t\tHere is the JSON Schema instance your output must adhere to:\n" + | |
| 167 | - "\t\t\t\t```%s```"; | |
| 168 | - return String.format(template, this.jsonSchema); | |
| 169 | - } | |
| 170 | - | |
| 171 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/parser/FormatProvider.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.parser; | |
| 18 | - | |
| 19 | -/** | |
| 20 | - * Implementations of this interface provides instructions for how the output of a | |
| 21 | - * language generative should be formatted. | |
| 22 | - * | |
| 23 | - * @author Mark Pollack | |
| 24 | - */ | |
| 25 | -public interface FormatProvider { | |
| 26 | - | |
| 27 | - /** | |
| 28 | - * @return Returns a string containing instructions for how the output of a language | |
| 29 | - * generative should be formatted. | |
| 30 | - */ | |
| 31 | - String getFormat(); | |
| 32 | - | |
| 33 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/parser/ListOutputParser.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | -package org.springframework.ai.parser; | |
| 17 | - | |
| 18 | -import org.springframework.core.convert.support.DefaultConversionService; | |
| 19 | - | |
| 20 | -import java.util.List; | |
| 21 | - | |
| 22 | -/** | |
| 23 | - * {@link OutputParser} implementation that uses a {@link DefaultConversionService} to | |
| 24 | - * convert the LLM output into a {@link List} instance. | |
| 25 | - * | |
| 26 | - * @author Mark Pollack | |
| 27 | - * @author Christian Tzolov | |
| 28 | - */ | |
| 29 | -public class ListOutputParser extends AbstractConversionServiceOutputParser<List<String>> { | |
| 30 | - | |
| 31 | - public ListOutputParser(DefaultConversionService defaultConversionService) { | |
| 32 | - super(defaultConversionService); | |
| 33 | - } | |
| 34 | - | |
| 35 | - @Override | |
| 36 | - public String getFormat() { | |
| 37 | -// return """ | |
| 38 | -// Your response should be a list of comma separated values | |
| 39 | -// eg: `foo, bar, baz` | |
| 40 | -// """; | |
| 41 | - return "Your response should be a list of comma separated values\n" + | |
| 42 | - "\t\t\t\teg: `foo, bar, baz`"; | |
| 43 | - } | |
| 44 | - | |
| 45 | - @Override | |
| 46 | - public List<String> parse(String text) { | |
| 47 | - return getConversionService().convert(text, List.class); | |
| 48 | - } | |
| 49 | - | |
| 50 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/parser/MapOutputParser.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.parser; | |
| 18 | - | |
| 19 | -import org.springframework.messaging.Message; | |
| 20 | -import org.springframework.messaging.converter.MappingJackson2MessageConverter; | |
| 21 | -import org.springframework.messaging.support.MessageBuilder; | |
| 22 | - | |
| 23 | -import java.nio.charset.StandardCharsets; | |
| 24 | -import java.util.HashMap; | |
| 25 | -import java.util.Map; | |
| 26 | - | |
| 27 | -/** | |
| 28 | - * {@link OutputParser} implementation that uses a pre-configured | |
| 29 | - * {@link MappingJackson2MessageConverter} to convert the LLM output into a | |
| 30 | - * java.util.Map<String, Object> instance. | |
| 31 | - * | |
| 32 | - * @author Mark Pollack | |
| 33 | - * @author Christian Tzolov | |
| 34 | - */ | |
| 35 | -public class MapOutputParser extends AbstractMessageConverterOutputParser<Map<String, Object>> { | |
| 36 | - | |
| 37 | - public MapOutputParser() { | |
| 38 | - super(new MappingJackson2MessageConverter()); | |
| 39 | - } | |
| 40 | - | |
| 41 | - @Override | |
| 42 | - public Map<String, Object> parse(String text) { | |
| 43 | - Message<?> message = MessageBuilder.withPayload(text.getBytes(StandardCharsets.UTF_8)).build(); | |
| 44 | - return (Map) getMessageConverter().fromMessage(message, HashMap.class); | |
| 45 | - } | |
| 46 | - | |
| 47 | - @Override | |
| 48 | - public String getFormat() { | |
| 49 | -// String raw = """ | |
| 50 | -// Your response should be in JSON format. | |
| 51 | -// The data structure for the JSON should match this Java class: %s | |
| 52 | -// Do not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation. | |
| 53 | -// """; | |
| 54 | - String raw = "Your response should be in JSON format.\n" + | |
| 55 | - "\t\t\t\tThe data structure for the JSON should match this Java class: %s\n" + | |
| 56 | - "\t\t\t\tDo not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation."; | |
| 57 | - return String.format(raw, "java.util.HashMap"); | |
| 58 | - } | |
| 59 | - | |
| 60 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/parser/OutputParser.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.parser; | |
| 18 | - | |
| 19 | -/** | |
| 20 | - * Converts the (raw) LLM output into a structured responses of type. The | |
| 21 | - * {@link FormatProvider#getFormat()} method should provide the LLM prompt description of | |
| 22 | - * the desired format. | |
| 23 | - * | |
| 24 | - * @param <T> Specifies the desired response type. | |
| 25 | - * @author Mark Pollack | |
| 26 | - * @author Christian Tzolov | |
| 27 | - */ | |
| 28 | -public interface OutputParser<T> extends Parser<T>, FormatProvider { | |
| 29 | - | |
| 30 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/parser/Parser.java deleted
| 1 | -/* | |
| 2 | - * Copyright 2023 the original author or authors. | |
| 3 | - * | |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | - * you may not use this file except in compliance with the License. | |
| 6 | - * You may obtain a copy of the License at | |
| 7 | - * | |
| 8 | - * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | - * | |
| 10 | - * Unless required by applicable law or agreed to in writing, software | |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | - * See the License for the specific language governing permissions and | |
| 14 | - * limitations under the License. | |
| 15 | - */ | |
| 16 | - | |
| 17 | -package org.springframework.ai.parser; | |
| 18 | - | |
| 19 | -@FunctionalInterface | |
| 20 | -public interface Parser<T> { | |
| 21 | - | |
| 22 | - T parse(String text); | |
| 23 | - | |
| 24 | -} |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/parser/README.md deleted
| 1 | -# Output Parsing | |
| 2 | - | |
| 3 | -* [Documentation](https://docs.spring.io/spring-ai/reference/concepts.html#_output_parsing) | |
| 4 | -* [Usage examples](https://github.com/spring-projects/spring-ai/blob/main/spring-ai-openai/src/test/java/org/springframework/ai/openai/client/ClientIT.java) | |
| 5 | - | |
| 6 | -The output of AI models traditionally arrives as a java.util.String, even if you ask for the reply to be in JSON. It may be the correct JSON, but it isn’t a JSON data structure. It is just a string. Also, asking "for JSON" as part of the prompt isn’t 100% accurate. | |
| 7 | - | |
| 8 | -This intricacy has led to the emergence of a specialized field involving the creation of prompts to yield the intended output, followed by parsing the resulting simple string into a usable data structure for application integration. | |
| 9 | - | |
| 10 | -Output parsing employs meticulously crafted prompts, often necessitating multiple interactions with the model to achieve the desired formatting. | |
| 11 | - | |
| 12 | -This challenge has prompted OpenAI to introduce 'OpenAI Functions' as a means to specify the desired output format from the model precisely. |
yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/QianWenChatClientTests.java
| ... | ... | @@ -37,8 +37,8 @@ public class QianWenChatClientTests { |
| 37 | 37 | QianWenApi qianWenApi = new QianWenApi("sk-Zsd81gZYg7", QianWenChatModal.QWEN_72B_CHAT); |
| 38 | 38 | QianWenOptions qianWenOptions = new QianWenOptions(); |
| 39 | 39 | qianWenOptions.setTopP(0.8F); |
| 40 | - qianWenOptions.setTopK(3); | |
| 41 | - qianWenOptions.setTemperature(0.6F); | |
| 40 | +// qianWenOptions.setTopK(3); TODO 芋艿:临时处理 | |
| 41 | +// qianWenOptions.setTemperature(0.6F); TODO 芋艿:临时处理 | |
| 42 | 42 | qianWenChatClient = new QianWenChatClient( |
| 43 | 43 | qianWenApi, |
| 44 | 44 | qianWenOptions | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/openAiImage/OpenAiImageClientTests.java
| 1 | 1 | package cn.iocoder.yudao.framework.ai.openAiImage; |
| 2 | 2 | |
| 3 | -import org.springframework.ai.models.openai.OpenAiImageApi; | |
| 4 | -import org.springframework.ai.models.openai.OpenAiImageClient; | |
| 5 | -import org.springframework.ai.models.openai.OpenAiImageOptions; | |
| 6 | 3 | import org.springframework.ai.image.ImagePrompt; |
| 7 | 4 | import org.springframework.ai.image.ImageResponse; |
| 8 | 5 | import org.junit.Before; |
| 9 | 6 | import org.junit.Test; |
| 7 | +import org.springframework.ai.openai.OpenAiImageClient; | |
| 8 | +import org.springframework.ai.openai.OpenAiImageOptions; | |
| 9 | +import org.springframework.ai.openai.api.OpenAiImageApi; | |
| 10 | 10 | |
| 11 | 11 | import javax.imageio.ImageIO; |
| 12 | 12 | import javax.swing.*; |
| ... | ... | @@ -29,8 +29,8 @@ public class OpenAiImageClientTests { |
| 29 | 29 | public void setup() { |
| 30 | 30 | // 初始化 openAiImageClient |
| 31 | 31 | this.openAiImageClient = new OpenAiImageClient( |
| 32 | - new OpenAiImageApi(""), | |
| 33 | - new OpenAiImageOptions().setResponseFormat(OpenAiImageOptions.ResponseFormatEnum.URL.getValue()) | |
| 32 | + new OpenAiImageApi("") | |
| 33 | +// new OpenAiImageOptions().setResponseFormat(OpenAiImageOptions.ResponseFormatEnum.URL.getValue()) TODO 芋艿:临时处理 | |
| 34 | 34 | ); |
| 35 | 35 | } |
| 36 | 36 | ... | ... |