feat: spring ai 1.0.0 m1 version adaptation (#3768)

Signed-off-by: yuluo-yx <yuluo08290126@gmail.com>
pull/3769/head
YuLuo 8 months ago committed by GitHub
parent f337b70dfe
commit c91d229e7f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -22,7 +22,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.0.0
*/ */
@SpringBootApplication @SpringBootApplication

@ -40,7 +40,7 @@ import org.springframework.web.bind.annotation.RestController;
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.0.0
*/ */
@RestController @RestController
@ -133,7 +133,7 @@ public class TongYiController {
@Qualifier("tongYiAudioSimpleServiceImpl") @Qualifier("tongYiAudioSimpleServiceImpl")
private TongYiService tongYiAudioService; private TongYiService tongYiAudioService;
@GetMapping("/audio") @GetMapping("/audio/speech")
public String genAudio(@RequestParam(value = "prompt", public String genAudio(@RequestParam(value = "prompt",
defaultValue = "你好Spring Cloud Alibaba AI 框架!") String prompt) { defaultValue = "你好Spring Cloud Alibaba AI 框架!") String prompt) {

@ -21,7 +21,7 @@ import java.util.List;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.0.0
*/ */
public class ActorsFilms { public class ActorsFilms {

@ -19,7 +19,7 @@ package com.alibaba.cloud.ai.example.tongyi.models;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.0.0
*/ */
public class Completion { public class Completion {

@ -28,7 +28,7 @@ import org.springframework.ai.image.ImageResponse;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.0.0
*/ */
public abstract class AbstractTongYiServiceImpl implements TongYiService { public abstract class AbstractTongYiServiceImpl implements TongYiService {

@ -29,7 +29,7 @@ import org.springframework.ai.image.ImageResponse;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.0.0
*/ */
public interface TongYiService { public interface TongYiService {

@ -24,9 +24,8 @@ import java.time.format.DateTimeFormatter;
import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl; import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl;
import com.alibaba.cloud.ai.example.tongyi.service.TongYiService; import com.alibaba.cloud.ai.example.tongyi.service.TongYiService;
import com.alibaba.cloud.ai.tongyi.audio.speech.api.SpeechClient; import com.alibaba.cloud.ai.tongyi.audio.speech.api.SpeechModel;
import com.alibaba.dashscope.audio.tts.SpeechSynthesisAudioFormat; import com.alibaba.dashscope.audio.tts.SpeechSynthesisAudioFormat;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -35,19 +34,19 @@ import org.springframework.stereotype.Service;
/** /**
* @author yuluo * @author yuluo
* @author 1481556636@qq.com * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.1.0
*/ */
@Slf4j
@Service @Service
public class TongYiAudioSimpleServiceImpl extends AbstractTongYiServiceImpl { public class TongYiAudioSimpleServiceImpl extends AbstractTongYiServiceImpl {
private static final Logger logger = LoggerFactory.getLogger(TongYiService.class); private static final Logger logger = LoggerFactory.getLogger(TongYiService.class);
private final SpeechClient speechClient; private final SpeechModel speechClient;
@Autowired @Autowired
public TongYiAudioSimpleServiceImpl(SpeechClient client) { public TongYiAudioSimpleServiceImpl(SpeechModel client) {
this.speechClient = client; this.speechClient = client;
} }

@ -28,13 +28,12 @@ import java.util.List;
import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl; import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl;
import com.alibaba.cloud.ai.example.tongyi.service.TongYiService; import com.alibaba.cloud.ai.example.tongyi.service.TongYiService;
import com.alibaba.cloud.ai.tongyi.audio.transcription.TongYiAudioTranscriptionClient; import com.alibaba.cloud.ai.tongyi.audio.transcription.TongYiAudioTranscriptionModel;
import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionPrompt; import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionPrompt;
import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionResult; import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionResult;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -45,17 +44,21 @@ import org.springframework.stereotype.Service;
/** /**
* @author xYLiu * @author xYLiu
* @since 2024/5/15 14:55 * @author yuluo
* @since 2023.0.1.0
*/ */
@Slf4j
@Service @Service
public class TongYiAudioTranscriptionServiceImpl extends AbstractTongYiServiceImpl { public class TongYiAudioTranscriptionServiceImpl extends AbstractTongYiServiceImpl {
private static final Logger logger = LoggerFactory.getLogger(TongYiService.class); private static final Logger logger = LoggerFactory.getLogger(TongYiService.class);
private final TongYiAudioTranscriptionClient audioTranscriptionClient;
private final TongYiAudioTranscriptionModel audioTranscriptionModel;
@Autowired @Autowired
public TongYiAudioTranscriptionServiceImpl(final TongYiAudioTranscriptionClient audioTranscriptionClient) { public TongYiAudioTranscriptionServiceImpl(final TongYiAudioTranscriptionModel transcriptionModel) {
this.audioTranscriptionClient = audioTranscriptionClient;
this.audioTranscriptionModel = transcriptionModel;
} }
@Override @Override
@ -72,7 +75,7 @@ public class TongYiAudioTranscriptionServiceImpl extends AbstractTongYiServiceIm
} }
AudioTranscriptionPrompt audioTranscriptionPrompt = new AudioTranscriptionPrompt(resource); AudioTranscriptionPrompt audioTranscriptionPrompt = new AudioTranscriptionPrompt(resource);
return save(audioTranscriptionClient.call(audioTranscriptionPrompt).getResults()); return save(audioTranscriptionModel.call(audioTranscriptionPrompt).getResults());
} }
private String save(List<AudioTranscriptionResult> resultList) { private String save(List<AudioTranscriptionResult> resultList) {

@ -19,8 +19,6 @@ package com.alibaba.cloud.ai.example.tongyi.service.impl.helloworld;
import java.util.Map; import java.util.Map;
import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl; import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl;
import com.alibaba.cloud.ai.example.tongyi.service.TongYiService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
@ -33,19 +31,19 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
* Simple example. * The Chat simple example service implementation.
* There is optional message parameter whose default value is "Tell me a joke". pl The response to the request is from the TongYi models Service. * There is optional message parameter whose default value is "Tell me a joke".
* pl The response to the request is from the TongYi models Service.
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.0.0
*/ */
@Slf4j
@Service @Service
public class TongYiSimpleServiceImpl extends AbstractTongYiServiceImpl { public class TongYiSimpleServiceImpl extends AbstractTongYiServiceImpl {
private static final Logger logger = LoggerFactory.getLogger(TongYiService.class); private static final Logger logger = LoggerFactory.getLogger(TongYiSimpleServiceImpl.class);
private final ChatModel chatModel; private final ChatModel chatModel;
@ -79,7 +77,7 @@ public class TongYiSimpleServiceImpl extends AbstractTongYiServiceImpl {
.map(lastContent -> Map.of(message, fullContent.toString())) .map(lastContent -> Map.of(message, fullContent.toString()))
.block(); .block();
log.info(fullContent.toString()); logger.info(fullContent.toString());
return Map.of(message, fullContent.toString()); return Map.of(message, fullContent.toString());
} }

@ -17,10 +17,6 @@
package com.alibaba.cloud.ai.example.tongyi.service.impl.images; package com.alibaba.cloud.ai.example.tongyi.service.impl.images;
import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl; import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl;
import com.alibaba.cloud.ai.example.tongyi.service.TongYiService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.image.ImageModel; import org.springframework.ai.image.ImageModel;
import org.springframework.ai.image.ImagePrompt; import org.springframework.ai.image.ImagePrompt;
@ -33,15 +29,12 @@ import org.springframework.stereotype.Service;
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.0.0
*/ */
@Slf4j
@Service @Service
public class TongYiImagesServiceImpl extends AbstractTongYiServiceImpl { public class TongYiImagesServiceImpl extends AbstractTongYiServiceImpl {
private static final Logger logger = LoggerFactory.getLogger(TongYiService.class);
private final ImageModel imageModel; private final ImageModel imageModel;
@Autowired @Autowired
@ -54,7 +47,6 @@ public class TongYiImagesServiceImpl extends AbstractTongYiServiceImpl {
public ImageResponse genImg(String imgPrompt) { public ImageResponse genImg(String imgPrompt) {
var prompt = new ImagePrompt(imgPrompt); var prompt = new ImagePrompt(imgPrompt);
return imageModel.call(prompt); return imageModel.call(prompt);
} }

@ -20,8 +20,6 @@ import java.util.Map;
import com.alibaba.cloud.ai.example.tongyi.models.ActorsFilms; import com.alibaba.cloud.ai.example.tongyi.models.ActorsFilms;
import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl; import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl;
import com.alibaba.cloud.ai.example.tongyi.service.TongYiService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -38,14 +36,13 @@ import org.springframework.stereotype.Service;
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.0.0
*/ */
@Slf4j
@Service @Service
public class TongYiOutputParseServiceImpl extends AbstractTongYiServiceImpl { public class TongYiOutputParseServiceImpl extends AbstractTongYiServiceImpl {
private static final Logger logger = LoggerFactory.getLogger(TongYiService.class); private static final Logger logger = LoggerFactory.getLogger(TongYiOutputParseServiceImpl.class);
private final ChatModel chatModel; private final ChatModel chatModel;

@ -19,10 +19,6 @@ package com.alibaba.cloud.ai.example.tongyi.service.impl.prompttemplate;
import java.util.Map; import java.util.Map;
import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl; import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl;
import com.alibaba.cloud.ai.example.tongyi.service.TongYiService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.chat.model.ChatModel;
@ -38,15 +34,12 @@ import org.springframework.stereotype.Service;
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.0.0
*/ */
@Slf4j
@Service @Service
public class TongYiPromptTemplateServiceImpl extends AbstractTongYiServiceImpl { public class TongYiPromptTemplateServiceImpl extends AbstractTongYiServiceImpl {
private static final Logger logger = LoggerFactory.getLogger(TongYiService.class);
private final ChatModel chatModel; private final ChatModel chatModel;
@Value("classpath:/prompts/joke-prompt.st") @Value("classpath:/prompts/joke-prompt.st")

@ -20,10 +20,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl; import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl;
import com.alibaba.cloud.ai.example.tongyi.service.TongYiService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.messages.UserMessage;
@ -37,15 +33,12 @@ import org.springframework.stereotype.Service;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.0.0
*/ */
@Slf4j
@Service @Service
public class TongYiRolesServiceImpl extends AbstractTongYiServiceImpl { public class TongYiRolesServiceImpl extends AbstractTongYiServiceImpl {
private static final Logger logger = LoggerFactory.getLogger(TongYiService.class);
private final ChatModel chatModel; private final ChatModel chatModel;
public TongYiRolesServiceImpl(ChatModel chatModel) { public TongYiRolesServiceImpl(ChatModel chatModel) {
@ -65,7 +58,6 @@ public class TongYiRolesServiceImpl extends AbstractTongYiServiceImpl {
In TongYi models, System role must appear at the top of the message and can only appear once. In TongYi models, System role must appear at the top of the message and can only appear once.
https://help.aliyun.com/zh/dashscope/developer-reference/api-details?spm=a2c4g.11186623.0.0.4dbcc11akAaRbs#b9ad0a10cfhpe https://help.aliyun.com/zh/dashscope/developer-reference/api-details?spm=a2c4g.11186623.0.0.4dbcc11akAaRbs#b9ad0a10cfhpe
*/ */
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource); SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);

@ -21,10 +21,6 @@ import java.util.Map;
import com.alibaba.cloud.ai.example.tongyi.models.Completion; import com.alibaba.cloud.ai.example.tongyi.models.Completion;
import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl; import com.alibaba.cloud.ai.example.tongyi.service.AbstractTongYiServiceImpl;
import com.alibaba.cloud.ai.example.tongyi.service.TongYiService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.Generation; import org.springframework.ai.chat.model.Generation;
@ -39,15 +35,12 @@ import org.springframework.stereotype.Service;
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.0.0
*/ */
@Slf4j
@Service @Service
public class TongYiStuffServiceImpl extends AbstractTongYiServiceImpl { public class TongYiStuffServiceImpl extends AbstractTongYiServiceImpl {
private static final Logger logger = LoggerFactory.getLogger(TongYiService.class);
private final ChatModel chatModel; private final ChatModel chatModel;
public TongYiStuffServiceImpl(ChatModel chatModel) { public TongYiStuffServiceImpl(ChatModel chatModel) {

@ -1,6 +1,6 @@
# Spring Cloud Alibaba AI Text Embedding # Spring Cloud Alibaba AI Text Embedding
`TongYiController` 接受一个 HTTP GET 请求 `http://localhost:8080/ai/audio`。 `TongYiController` 接受一个 HTTP GET 请求 `http://localhost:8080/ai/textEmbedding`。
`controller` 将会调用 `TongYiService` 中的 `genAudio` 方法,完成服务请求得到响应。 `controller` 将会调用 `TongYiService` 中的 `genAudio` 方法,完成服务请求得到响应。
有一个可选的 `text` 参数其默认值为“Spring Cloud Alibaba AI 框架!”。 请求响应来自 Alibaba TongYi Text Embedding 服务。 有一个可选的 `text` 参数其默认值为“Spring Cloud Alibaba AI 框架!”。 请求响应来自 Alibaba TongYi Text Embedding 服务。

@ -18,17 +18,17 @@ package com.alibaba.cloud.ai.tongyi;
import java.util.Objects; import java.util.Objects;
import com.alibaba.cloud.ai.tongyi.audio.speech.TongYiAudioSpeechClient; import com.alibaba.cloud.ai.tongyi.audio.speech.TongYiAudioSpeechModel;
import com.alibaba.cloud.ai.tongyi.audio.speech.TongYiAudioSpeechProperties; import com.alibaba.cloud.ai.tongyi.audio.speech.TongYiAudioSpeechProperties;
import com.alibaba.cloud.ai.tongyi.audio.transcription.TongYiAudioTranscriptionClient; import com.alibaba.cloud.ai.tongyi.audio.transcription.TongYiAudioTranscriptionModel;
import com.alibaba.cloud.ai.tongyi.audio.transcription.TongYiAudioTranscriptionProperties; import com.alibaba.cloud.ai.tongyi.audio.transcription.TongYiAudioTranscriptionProperties;
import com.alibaba.cloud.ai.tongyi.chat.TongYiChatClient; import com.alibaba.cloud.ai.tongyi.chat.TongYiChatModel;
import com.alibaba.cloud.ai.tongyi.chat.TongYiChatProperties; import com.alibaba.cloud.ai.tongyi.chat.TongYiChatProperties;
import com.alibaba.cloud.ai.tongyi.constants.TongYiConstants; import com.alibaba.cloud.ai.tongyi.common.constants.TongYiConstants;
import com.alibaba.cloud.ai.tongyi.embedding.TongYiTextEmbeddingClient; import com.alibaba.cloud.ai.tongyi.common.exception.TongYiException;
import com.alibaba.cloud.ai.tongyi.embedding.TongYiTextEmbeddingModel;
import com.alibaba.cloud.ai.tongyi.embedding.TongYiTextEmbeddingProperties; import com.alibaba.cloud.ai.tongyi.embedding.TongYiTextEmbeddingProperties;
import com.alibaba.cloud.ai.tongyi.exception.TongYiException; import com.alibaba.cloud.ai.tongyi.image.TongYiImagesModel;
import com.alibaba.cloud.ai.tongyi.image.TongYiImagesClient;
import com.alibaba.cloud.ai.tongyi.image.TongYiImagesProperties; import com.alibaba.cloud.ai.tongyi.image.TongYiImagesProperties;
import com.alibaba.dashscope.aigc.generation.Generation; import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis; import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis;
@ -53,16 +53,17 @@ import org.springframework.context.annotation.Scope;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
@AutoConfiguration @AutoConfiguration
@ConditionalOnClass({ @ConditionalOnClass({
MessageManager.class, MessageManager.class,
TongYiChatClient.class, TongYiChatModel.class,
TongYiImagesClient.class, TongYiImagesModel.class,
TongYiAudioSpeechClient.class, TongYiAudioSpeechModel.class,
TongYiAudioTranscriptionClient.class TongYiTextEmbeddingModel.class,
TongYiAudioTranscriptionModel.class
}) })
@EnableConfigurationProperties({ @EnableConfigurationProperties({
TongYiChatProperties.class, TongYiChatProperties.class,
@ -137,14 +138,14 @@ public class TongYiAutoConfiguration {
havingValue = "true", havingValue = "true",
matchIfMissing = true matchIfMissing = true
) )
public TongYiChatClient tongYiChatClient(Generation generation, public TongYiChatModel tongYiChatClient(Generation generation,
TongYiChatProperties chatOptions, TongYiChatProperties chatOptions,
TongYiConnectionProperties connectionProperties TongYiConnectionProperties connectionProperties
) { ) {
settingApiKey(connectionProperties); settingApiKey(connectionProperties);
return new TongYiChatClient(generation, chatOptions.getOptions()); return new TongYiChatModel(generation, chatOptions.getOptions());
} }
@Bean @Bean
@ -154,7 +155,7 @@ public class TongYiAutoConfiguration {
havingValue = "true", havingValue = "true",
matchIfMissing = true matchIfMissing = true
) )
public TongYiImagesClient tongYiImagesClient( public TongYiImagesModel tongYiImagesClient(
ImageSynthesis imageSynthesis, ImageSynthesis imageSynthesis,
TongYiImagesProperties imagesOptions, TongYiImagesProperties imagesOptions,
TongYiConnectionProperties connectionProperties TongYiConnectionProperties connectionProperties
@ -162,7 +163,7 @@ public class TongYiAutoConfiguration {
settingApiKey(connectionProperties); settingApiKey(connectionProperties);
return new TongYiImagesClient(imageSynthesis, imagesOptions.getOptions()); return new TongYiImagesModel(imageSynthesis, imagesOptions.getOptions());
} }
@Bean @Bean
@ -172,7 +173,7 @@ public class TongYiAutoConfiguration {
havingValue = "true", havingValue = "true",
matchIfMissing = true matchIfMissing = true
) )
public TongYiAudioSpeechClient tongYiAudioSpeechClient( public TongYiAudioSpeechModel tongYiAudioSpeechClient(
SpeechSynthesizer speechSynthesizer, SpeechSynthesizer speechSynthesizer,
TongYiAudioSpeechProperties speechProperties, TongYiAudioSpeechProperties speechProperties,
TongYiConnectionProperties connectionProperties TongYiConnectionProperties connectionProperties
@ -180,7 +181,7 @@ public class TongYiAutoConfiguration {
settingApiKey(connectionProperties); settingApiKey(connectionProperties);
return new TongYiAudioSpeechClient(speechSynthesizer, speechProperties.getOptions()); return new TongYiAudioSpeechModel(speechSynthesizer, speechProperties.getOptions());
} }
@Bean @Bean
@ -190,14 +191,14 @@ public class TongYiAutoConfiguration {
havingValue = "true", havingValue = "true",
matchIfMissing = true matchIfMissing = true
) )
public TongYiAudioTranscriptionClient tongYiAudioTranscriptionClient( public TongYiAudioTranscriptionModel tongYiAudioTranscriptionClient(
Transcription transcription, Transcription transcription,
TongYiAudioTranscriptionProperties transcriptionProperties, TongYiAudioTranscriptionProperties transcriptionProperties,
TongYiConnectionProperties connectionProperties) { TongYiConnectionProperties connectionProperties) {
settingApiKey(connectionProperties); settingApiKey(connectionProperties);
return new TongYiAudioTranscriptionClient( return new TongYiAudioTranscriptionModel(
transcriptionProperties.getOptions(), transcriptionProperties.getOptions(),
transcription transcription
); );
@ -210,13 +211,13 @@ public class TongYiAutoConfiguration {
havingValue = "true", havingValue = "true",
matchIfMissing = true matchIfMissing = true
) )
public TongYiTextEmbeddingClient tongYiTextEmbeddingClient( public TongYiTextEmbeddingModel tongYiTextEmbeddingClient(
TextEmbedding textEmbedding, TextEmbedding textEmbedding,
TongYiConnectionProperties connectionProperties TongYiConnectionProperties connectionProperties
) { ) {
settingApiKey(connectionProperties); settingApiKey(connectionProperties);
return new TongYiTextEmbeddingClient(textEmbedding); return new TongYiTextEmbeddingModel(textEmbedding);
} }
/** /**

@ -18,25 +18,26 @@ package com.alibaba.cloud.ai.tongyi;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import static com.alibaba.cloud.ai.tongyi.common.constants.TongYiConstants.SCA_AI_CONFIGURATION;
/** /**
* TongYi connection API properties. * Spring Cloud Alibaba AI TongYi LLM connection properties.
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
@ConfigurationProperties(TongYiConnectionProperties.CONFIG_PREFIX) @ConfigurationProperties(TongYiConnectionProperties.CONFIG_PREFIX)
public class TongYiConnectionProperties { public class TongYiConnectionProperties {
/** /**
* Spring Cloud Alibaba AI configuration prefix. * Spring Cloud Alibaba AI connection configuration Prefix.
*/ */
public static final String CONFIG_PREFIX = "spring.cloud.ai.tongyi"; public static final String CONFIG_PREFIX = SCA_AI_CONFIGURATION + "tongyi";
/** /**
* API key. * TongYi LLM API key.
*/ */
private String apiKey; private String apiKey;
@ -47,4 +48,5 @@ public class TongYiConnectionProperties {
public void setApiKey(String apiKey) { public void setApiKey(String apiKey) {
this.apiKey = apiKey; this.apiKey = apiKey;
} }
} }

@ -22,7 +22,7 @@ package com.alibaba.cloud.ai.tongyi.audio;
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public final class AudioSpeechModels { public final class AudioSpeechModels {

@ -19,7 +19,7 @@ package com.alibaba.cloud.ai.tongyi.audio;
/** /**
* @author xYLiu * @author xYLiu
* @author yuluo * @author yuluo
* @since 2023.0.0.0 * @since 2023.0.1.0
*/ */
public final class AudioTranscriptionModels { public final class AudioTranscriptionModels {

@ -20,10 +20,10 @@ import java.nio.ByteBuffer;
import com.alibaba.cloud.ai.tongyi.audio.AudioSpeechModels; import com.alibaba.cloud.ai.tongyi.audio.AudioSpeechModels;
import com.alibaba.cloud.ai.tongyi.audio.speech.api.Speech; import com.alibaba.cloud.ai.tongyi.audio.speech.api.Speech;
import com.alibaba.cloud.ai.tongyi.audio.speech.api.SpeechClient; import com.alibaba.cloud.ai.tongyi.audio.speech.api.SpeechModel;
import com.alibaba.cloud.ai.tongyi.audio.speech.api.SpeechPrompt; import com.alibaba.cloud.ai.tongyi.audio.speech.api.SpeechPrompt;
import com.alibaba.cloud.ai.tongyi.audio.speech.api.SpeechResponse; import com.alibaba.cloud.ai.tongyi.audio.speech.api.SpeechResponse;
import com.alibaba.cloud.ai.tongyi.audio.speech.api.SpeechStreamClient; import com.alibaba.cloud.ai.tongyi.audio.speech.api.SpeechStreamModel;
import com.alibaba.cloud.ai.tongyi.metadata.audio.TongYiAudioSpeechResponseMetadata; import com.alibaba.cloud.ai.tongyi.metadata.audio.TongYiAudioSpeechResponseMetadata;
import com.alibaba.dashscope.audio.tts.SpeechSynthesisParam; import com.alibaba.dashscope.audio.tts.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.tts.SpeechSynthesisResult; import com.alibaba.dashscope.audio.tts.SpeechSynthesisResult;
@ -42,10 +42,10 @@ import org.springframework.util.Assert;
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class TongYiAudioSpeechClient implements SpeechClient, SpeechStreamClient { public class TongYiAudioSpeechModel implements SpeechModel, SpeechStreamModel {
private final Logger logger = LoggerFactory.getLogger(getClass()); private final Logger logger = LoggerFactory.getLogger(getClass());
@ -68,7 +68,7 @@ public class TongYiAudioSpeechClient implements SpeechClient, SpeechStreamClient
* TongYiAudioSpeechClient constructor. * TongYiAudioSpeechClient constructor.
* @param speechSynthesizer the speech synthesizer * @param speechSynthesizer the speech synthesizer
*/ */
public TongYiAudioSpeechClient(SpeechSynthesizer speechSynthesizer) { public TongYiAudioSpeechModel(SpeechSynthesizer speechSynthesizer) {
this(speechSynthesizer, null); this(speechSynthesizer, null);
} }
@ -78,7 +78,7 @@ public class TongYiAudioSpeechClient implements SpeechClient, SpeechStreamClient
* @param speechSynthesizer the speech synthesizer * @param speechSynthesizer the speech synthesizer
* @param tongYiAudioOptions the tongYi audio options * @param tongYiAudioOptions the tongYi audio options
*/ */
public TongYiAudioSpeechClient(SpeechSynthesizer speechSynthesizer, TongYiAudioSpeechOptions tongYiAudioOptions) { public TongYiAudioSpeechModel(SpeechSynthesizer speechSynthesizer, TongYiAudioSpeechOptions tongYiAudioOptions) {
Assert.notNull(speechSynthesizer, "speechSynthesizer must not be null"); Assert.notNull(speechSynthesizer, "speechSynthesizer must not be null");
Assert.notNull(tongYiAudioOptions, "tongYiAudioOptions must not be null"); Assert.notNull(tongYiAudioOptions, "tongYiAudioOptions must not be null");

@ -25,7 +25,7 @@ import org.springframework.ai.model.ModelOptions;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class TongYiAudioSpeechOptions implements ModelOptions { public class TongYiAudioSpeechOptions implements ModelOptions {

@ -17,31 +17,28 @@
package com.alibaba.cloud.ai.tongyi.audio.speech; package com.alibaba.cloud.ai.tongyi.audio.speech;
import com.alibaba.cloud.ai.tongyi.audio.AudioSpeechModels; import com.alibaba.cloud.ai.tongyi.audio.AudioSpeechModels;
import com.alibaba.cloud.ai.tongyi.image.TongYiImagesProperties;
import com.alibaba.dashscope.audio.tts.SpeechSynthesisAudioFormat; import com.alibaba.dashscope.audio.tts.SpeechSynthesisAudioFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty; import org.springframework.boot.context.properties.NestedConfigurationProperty;
import static com.alibaba.cloud.ai.tongyi.common.constants.TongYiConstants.SCA_AI_CONFIGURATION;
/** /**
* TongYi audio speech configuration properties. * TongYi audio speech configuration properties.
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
@ConfigurationProperties(TongYiAudioSpeechProperties.CONFIG_PREFIX) @ConfigurationProperties(TongYiAudioSpeechProperties.CONFIG_PREFIX)
public class TongYiAudioSpeechProperties { public class TongYiAudioSpeechProperties {
private final Logger logger = LoggerFactory.getLogger(TongYiImagesProperties.class);
/** /**
* Spring Cloud Alibaba AI configuration prefix. * Spring Cloud Alibaba AI configuration prefix.
*/ */
public static final String CONFIG_PREFIX = "spring.cloud.ai.tongyi.audio.speech"; public static final String CONFIG_PREFIX = SCA_AI_CONFIGURATION + "audio.speech";
/** /**
* Default TongYi Chat model. * Default TongYi Chat model.
*/ */

@ -26,7 +26,7 @@ import org.springframework.lang.Nullable;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class Speech implements ModelResult<ByteBuffer> { public class Speech implements ModelResult<ByteBuffer> {

@ -19,9 +19,12 @@ package com.alibaba.cloud.ai.tongyi.audio.speech.api;
import java.util.Objects; import java.util.Objects;
/** /**
* The {@link SpeechMessage} class represents a single text message to
* be converted to speech by the TongYi LLM TTS.
*
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class SpeechMessage { public class SpeechMessage {

@ -21,7 +21,7 @@ import org.springframework.ai.model.ResultMetadata;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public interface SpeechMetadata extends ResultMetadata { public interface SpeechMetadata extends ResultMetadata {

@ -27,7 +27,7 @@ import org.springframework.ai.model.Model;
*/ */
@FunctionalInterface @FunctionalInterface
public interface SpeechClient extends Model<SpeechPrompt, SpeechResponse> { public interface SpeechModel extends Model<SpeechPrompt, SpeechResponse> {
/** /**
* Generates spoken audio from the provided text message. * Generates spoken audio from the provided text message.

@ -25,7 +25,7 @@ import org.springframework.ai.model.ModelRequest;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class SpeechPrompt implements ModelRequest<SpeechMessage> { public class SpeechPrompt implements ModelRequest<SpeechMessage> {

@ -27,7 +27,7 @@ import org.springframework.ai.model.ModelResponse;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class SpeechResponse implements ModelResponse<Speech> { public class SpeechResponse implements ModelResponse<Speech> {

@ -25,11 +25,11 @@ import org.springframework.ai.model.StreamingModel;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
@FunctionalInterface @FunctionalInterface
public interface SpeechStreamClient extends StreamingModel<SpeechPrompt, SpeechResponse> { public interface SpeechStreamModel extends StreamingModel<SpeechPrompt, SpeechResponse> {
/** /**
* Generates a stream of audio bytes from the provided text message. * Generates a stream of audio bytes from the provided text message.
@ -40,7 +40,6 @@ public interface SpeechStreamClient extends StreamingModel<SpeechPrompt, SpeechR
default Flux<ByteBuffer> stream(String message) { default Flux<ByteBuffer> stream(String message) {
SpeechPrompt prompt = new SpeechPrompt(message); SpeechPrompt prompt = new SpeechPrompt(message);
return stream(prompt).map(SpeechResponse::getResult).map(Speech::getOutput); return stream(prompt).map(SpeechResponse::getResult).map(Speech::getOutput);
} }

@ -26,7 +26,7 @@ import com.alibaba.cloud.ai.tongyi.audio.AudioTranscriptionModels;
import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionPrompt; import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionPrompt;
import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionResponse; import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionResponse;
import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionResult; import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionResult;
import com.alibaba.cloud.ai.tongyi.exception.TongYiException; import com.alibaba.cloud.ai.tongyi.common.exception.TongYiException;
import com.alibaba.cloud.ai.tongyi.metadata.audio.TongYiAudioTranscriptionResponseMetadata; import com.alibaba.cloud.ai.tongyi.metadata.audio.TongYiAudioTranscriptionResponseMetadata;
import com.alibaba.dashscope.audio.asr.transcription.Transcription; import com.alibaba.dashscope.audio.asr.transcription.Transcription;
import com.alibaba.dashscope.audio.asr.transcription.TranscriptionParam; import com.alibaba.dashscope.audio.asr.transcription.TranscriptionParam;
@ -39,14 +39,14 @@ import org.springframework.core.io.Resource;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* TongYiAudioTranscriptionClient is a client for TongYi audio transcription service for * TongYiAudioTranscriptionModel is a client for TongYi audio transcription service for
* Spring Cloud Alibaba AI. * Spring Cloud Alibaba AI.
* @author xYLiu * @author xYLiu
* @author yuluo * @author yuluo
* @since 2023.0.0.0 * @since 2023.0.1.0
*/ */
public class TongYiAudioTranscriptionClient public class TongYiAudioTranscriptionModel
implements Model<AudioTranscriptionPrompt, AudioTranscriptionResponse> { implements Model<AudioTranscriptionPrompt, AudioTranscriptionResponse> {
/** /**
@ -59,11 +59,11 @@ public class TongYiAudioTranscriptionClient
*/ */
private final Transcription transcription; private final Transcription transcription;
public TongYiAudioTranscriptionClient(Transcription transcription) { public TongYiAudioTranscriptionModel(Transcription transcription) {
this(null, transcription); this(null, transcription);
} }
public TongYiAudioTranscriptionClient(TongYiAudioTranscriptionOptions defaultOptions, public TongYiAudioTranscriptionModel(TongYiAudioTranscriptionOptions defaultOptions,
Transcription transcription) { Transcription transcription) {
Assert.notNull(transcription, "transcription must not be null"); Assert.notNull(transcription, "transcription must not be null");
Assert.notNull(defaultOptions, "defaultOptions must not be null"); Assert.notNull(defaultOptions, "defaultOptions must not be null");

@ -27,7 +27,7 @@ import org.springframework.ai.model.ModelOptions;
/** /**
* @author xYLiu * @author xYLiu
* @author yuluo * @author yuluo
* @since 2023.0.0.0 * @since 2023.0.1.0
*/ */
public class TongYiAudioTranscriptionOptions implements ModelOptions { public class TongYiAudioTranscriptionOptions implements ModelOptions {

@ -21,10 +21,12 @@ import com.alibaba.cloud.ai.tongyi.audio.AudioTranscriptionModels;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty; import org.springframework.boot.context.properties.NestedConfigurationProperty;
import static com.alibaba.cloud.ai.tongyi.common.constants.TongYiConstants.SCA_AI_CONFIGURATION;
/** /**
* @author xYLiu * @author xYLiu
* @author yuluo * @author yuluo
* @since 2023.0.0.0 * @since 2023.0.1.0
*/ */
@ConfigurationProperties(TongYiAudioTranscriptionProperties.CONFIG_PREFIX) @ConfigurationProperties(TongYiAudioTranscriptionProperties.CONFIG_PREFIX)
@ -33,7 +35,7 @@ public class TongYiAudioTranscriptionProperties {
/** /**
* Spring Cloud Alibaba AI configuration prefix. * Spring Cloud Alibaba AI configuration prefix.
*/ */
public static final String CONFIG_PREFIX = "spring.cloud.ai.tongyi.audio.transcription"; public static final String CONFIG_PREFIX = SCA_AI_CONFIGURATION + "audio.transcription";
/** /**
* Default TongYi Chat model. * Default TongYi Chat model.

@ -24,7 +24,7 @@ import org.springframework.core.io.Resource;
/** /**
* @author xYLiu * @author xYLiu
* @author yuluo * @author yuluo
* @since 2023.0.0.0 * @since 2023.0.1.0
*/ */
public class AudioTranscriptionPrompt implements ModelRequest<Resource> { public class AudioTranscriptionPrompt implements ModelRequest<Resource> {

@ -26,7 +26,7 @@ import org.springframework.ai.model.ResponseMetadata;
/** /**
* @author xYLiu * @author xYLiu
* @author yuluo * @author yuluo
* @since 2023.0.0.0 * @since 2023.0.1.0
*/ */
public class AudioTranscriptionResponse implements ModelResponse<AudioTranscriptionResult> { public class AudioTranscriptionResponse implements ModelResponse<AudioTranscriptionResult> {

@ -26,7 +26,7 @@ import org.springframework.ai.model.ResultMetadata;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0 * @since 2023.0.1.0
*/ */
public class AudioTranscriptionResult implements ModelResult<String> { public class AudioTranscriptionResult implements ModelResult<String> {

@ -21,7 +21,7 @@ import java.util.Objects;
import java.util.Set; import java.util.Set;
import com.alibaba.cloud.ai.tongyi.exception.TongYiException; import com.alibaba.cloud.ai.tongyi.common.exception.TongYiException;
import com.alibaba.dashscope.aigc.conversation.ConversationParam; import com.alibaba.dashscope.aigc.conversation.ConversationParam;
import com.alibaba.dashscope.aigc.generation.Generation; import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationOutput; import com.alibaba.dashscope.aigc.generation.GenerationOutput;
@ -61,19 +61,19 @@ import org.springframework.util.CollectionUtils;
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
* @see ChatModel * @see ChatModel
* @see com.alibaba.dashscope.aigc.generation * @see com.alibaba.dashscope.aigc.generation
*/ */
public class TongYiChatClient extends public class TongYiChatModel extends
AbstractFunctionCallSupport< AbstractFunctionCallSupport<
com.alibaba.dashscope.common.Message, com.alibaba.dashscope.common.Message,
ConversationParam, ConversationParam,
GenerationResult> GenerationResult>
implements ChatModel, StreamingChatModel { implements ChatModel, StreamingChatModel {
private static final Logger logger = LoggerFactory.getLogger(TongYiChatClient.class); private static final Logger logger = LoggerFactory.getLogger(TongYiChatModel.class);
/** /**
* DashScope generation client. * DashScope generation client.
@ -95,7 +95,7 @@ public class TongYiChatClient extends
* Initializes an instance of the TongYiChatClient. * Initializes an instance of the TongYiChatClient.
* @param generation DashScope generation client. * @param generation DashScope generation client.
*/ */
public TongYiChatClient(Generation generation) { public TongYiChatModel(Generation generation) {
this(generation, this(generation,
TongYiChatOptions.builder() TongYiChatOptions.builder()
@ -112,7 +112,7 @@ public class TongYiChatClient extends
* @param generation DashScope generation client. * @param generation DashScope generation client.
* @param options TongYi model params. * @param options TongYi model params.
*/ */
public TongYiChatClient(Generation generation, TongYiChatOptions options) { public TongYiChatModel(Generation generation, TongYiChatOptions options) {
this(generation, options, null); this(generation, options, null);
} }
@ -122,7 +122,7 @@ public class TongYiChatClient extends
* @param generation DashScope model generation client. * @param generation DashScope model generation client.
* @param options TongYi default chat completion api. * @param options TongYi default chat completion api.
*/ */
public TongYiChatClient(Generation generation, TongYiChatOptions options, public TongYiChatModel(Generation generation, TongYiChatOptions options,
FunctionCallbackContext functionCallbackContext) { FunctionCallbackContext functionCallbackContext) {
super(functionCallbackContext); super(functionCallbackContext);

@ -33,7 +33,7 @@ import org.springframework.util.Assert;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class TongYiChatOptions implements FunctionCallingOptions, ChatOptions { public class TongYiChatOptions implements FunctionCallingOptions, ChatOptions {

@ -22,10 +22,12 @@ import com.alibaba.dashscope.aigc.generation.GenerationParam;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty; import org.springframework.boot.context.properties.NestedConfigurationProperty;
import static com.alibaba.cloud.ai.tongyi.common.constants.TongYiConstants.SCA_AI_CONFIGURATION;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
@ConfigurationProperties(TongYiChatProperties.CONFIG_PREFIX) @ConfigurationProperties(TongYiChatProperties.CONFIG_PREFIX)
@ -34,7 +36,7 @@ public class TongYiChatProperties {
/** /**
* Spring Cloud Alibaba AI configuration prefix. * Spring Cloud Alibaba AI configuration prefix.
*/ */
public static final String CONFIG_PREFIX = "spring.cloud.ai.tongyi.chat"; public static final String CONFIG_PREFIX = SCA_AI_CONFIGURATION + "chat";
/** /**
* Default TongYi Chat model. * Default TongYi Chat model.

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.alibaba.cloud.ai.tongyi.constants; package com.alibaba.cloud.ai.tongyi.common.constants;
/** /**
* @author yuluo * @author yuluo
@ -26,6 +26,11 @@ public final class TongYiConstants {
private TongYiConstants() { private TongYiConstants() {
} }
/**
* Spring Cloud Alibaba AI configuration prefix.
*/
public static final String SCA_AI_CONFIGURATION = "spring.cloud.ai.tongyi.";
/** /**
* Spring Cloud Alibaba AI constants prefix. * Spring Cloud Alibaba AI constants prefix.
*/ */

@ -14,14 +14,14 @@
* limitations under the License. * limitations under the License.
*/ */
package com.alibaba.cloud.ai.tongyi.exception; package com.alibaba.cloud.ai.tongyi.common.exception;
/** /**
* TongYi models runtime exception. * TongYi models runtime exception.
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class TongYiException extends RuntimeException { public class TongYiException extends RuntimeException {

@ -14,14 +14,14 @@
* limitations under the License. * limitations under the License.
*/ */
package com.alibaba.cloud.ai.tongyi.exception; package com.alibaba.cloud.ai.tongyi.common.exception;
/** /**
* TongYi models images exception. * TongYi models images exception.
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class TongYiImagesException extends TongYiException { public class TongYiImagesException extends TongYiException {

@ -26,7 +26,7 @@ import org.springframework.ai.embedding.EmbeddingOptions;
* @author why_ohh * @author why_ohh
* @author yuluo * @author yuluo
* @author <a href="mailto:550588941@qq.com">why_ohh</a> * @author <a href="mailto:550588941@qq.com">why_ohh</a>
* @since 2023.0.0.0 * @since 2023.0.1.0
*/ */
public final class TongYiEmbeddingOptions implements EmbeddingOptions { public final class TongYiEmbeddingOptions implements EmbeddingOptions {

@ -19,7 +19,7 @@ package com.alibaba.cloud.ai.tongyi.embedding;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.alibaba.cloud.ai.tongyi.exception.TongYiException; import com.alibaba.cloud.ai.tongyi.common.exception.TongYiException;
import com.alibaba.cloud.ai.tongyi.metadata.TongYiTextEmbeddingResponseMetadata; import com.alibaba.cloud.ai.tongyi.metadata.TongYiTextEmbeddingResponseMetadata;
import com.alibaba.dashscope.embeddings.TextEmbedding; import com.alibaba.dashscope.embeddings.TextEmbedding;
import com.alibaba.dashscope.embeddings.TextEmbeddingParam; import com.alibaba.dashscope.embeddings.TextEmbeddingParam;
@ -39,17 +39,17 @@ import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* {@link TongYiTextEmbeddingClient} implementation for {@literal Alibaba DashScope}. * {@link TongYiTextEmbeddingModel} implementation for {@literal Alibaba DashScope}.
*
* @author why_ohh * @author why_ohh
* @author yuluo * @author yuluo
* @author <a href="mailto:550588941@qq.com">why_ohh</a> * @author <a href="mailto:550588941@qq.com">why_ohh</a>
* @since 2023.0.0.0 * @since 2023.0.1.0
* {@see TextEmbeddingClient}
*/ */
public class TongYiTextEmbeddingClient extends AbstractEmbeddingModel { public class TongYiTextEmbeddingModel extends AbstractEmbeddingModel {
private final Logger logger = LoggerFactory.getLogger(TongYiTextEmbeddingClient.class); private final Logger logger = LoggerFactory.getLogger(TongYiTextEmbeddingModel.class);
/** /**
* TongYi Text Embedding client. * TongYi Text Embedding client.
@ -63,12 +63,12 @@ public class TongYiTextEmbeddingClient extends AbstractEmbeddingModel {
private final TongYiEmbeddingOptions defaultOptions; private final TongYiEmbeddingOptions defaultOptions;
public TongYiTextEmbeddingClient(TextEmbedding textEmbedding) { public TongYiTextEmbeddingModel(TextEmbedding textEmbedding) {
this(textEmbedding, MetadataMode.EMBED); this(textEmbedding, MetadataMode.EMBED);
} }
public TongYiTextEmbeddingClient(TextEmbedding textEmbedding, MetadataMode metadataMode) { public TongYiTextEmbeddingModel(TextEmbedding textEmbedding, MetadataMode metadataMode) {
this(textEmbedding, metadataMode, this(textEmbedding, metadataMode,
TongYiEmbeddingOptions.builder() TongYiEmbeddingOptions.builder()
@ -77,7 +77,7 @@ public class TongYiTextEmbeddingClient extends AbstractEmbeddingModel {
); );
} }
public TongYiTextEmbeddingClient( public TongYiTextEmbeddingModel(
TextEmbedding textEmbedding, TextEmbedding textEmbedding,
MetadataMode metadataMode, MetadataMode metadataMode,
TongYiEmbeddingOptions options TongYiEmbeddingOptions options

@ -18,11 +18,13 @@ package com.alibaba.cloud.ai.tongyi.embedding;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import static com.alibaba.cloud.ai.tongyi.common.constants.TongYiConstants.SCA_AI_CONFIGURATION;
/** /**
* @author why_ohh * @author why_ohh
* @author yuluo * @author yuluo
* @author <a href="mailto:550588941@qq.com">why_ohh</a> * @author <a href="mailto:550588941@qq.com">why_ohh</a>
* @since 2023.0.0.0 * @since 2023.0.1.0
*/ */
@ConfigurationProperties(TongYiTextEmbeddingProperties.CONFIG_PREFIX) @ConfigurationProperties(TongYiTextEmbeddingProperties.CONFIG_PREFIX)
@ -31,7 +33,7 @@ public class TongYiTextEmbeddingProperties {
/** /**
* Prefix of TongYi Text Embedding properties. * Prefix of TongYi Text Embedding properties.
*/ */
public static final String CONFIG_PREFIX = "spring.cloud.ai.tongyi.embedding"; public static final String CONFIG_PREFIX = SCA_AI_CONFIGURATION + "embedding";
private boolean enabled = true; private boolean enabled = true;

@ -21,7 +21,7 @@ import java.net.URL;
import java.util.Base64; import java.util.Base64;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.alibaba.cloud.ai.tongyi.exception.TongYiImagesException; import com.alibaba.cloud.ai.tongyi.common.exception.TongYiImagesException;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis; import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisParam; import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisParam;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisResult; import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisResult;
@ -45,12 +45,12 @@ import static com.alibaba.cloud.ai.tongyi.metadata.TongYiImagesResponseMetadata.
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class TongYiImagesClient implements ImageModel { public class TongYiImagesModel implements ImageModel {
private final Logger logger = LoggerFactory.getLogger(TongYiImagesClient.class); private final Logger logger = LoggerFactory.getLogger(TongYiImagesModel.class);
/** /**
* Gen Images API. * Gen Images API.
@ -82,7 +82,7 @@ public class TongYiImagesClient implements ImageModel {
* @param imageSynthesis the image synthesis * @param imageSynthesis the image synthesis
* {@link ImageSynthesis} * {@link ImageSynthesis}
*/ */
public TongYiImagesClient(ImageSynthesis imageSynthesis) { public TongYiImagesModel(ImageSynthesis imageSynthesis) {
this(imageSynthesis, TongYiImagesOptions. this(imageSynthesis, TongYiImagesOptions.
builder() builder()
@ -97,7 +97,7 @@ public class TongYiImagesClient implements ImageModel {
* @param imageSynthesis {@link ImageSynthesis} * @param imageSynthesis {@link ImageSynthesis}
* @param imagesOptions {@link TongYiImagesOptions} * @param imagesOptions {@link TongYiImagesOptions}
*/ */
public TongYiImagesClient(ImageSynthesis imageSynthesis, TongYiImagesOptions imagesOptions) { public TongYiImagesModel(ImageSynthesis imageSynthesis, TongYiImagesOptions imagesOptions) {
Assert.notNull(imageSynthesis, "ImageSynthesis must not be null"); Assert.notNull(imageSynthesis, "ImageSynthesis must not be null");
Assert.notNull(imagesOptions, "TongYiImagesOptions must not be null"); Assert.notNull(imagesOptions, "TongYiImagesOptions must not be null");

@ -18,7 +18,7 @@ package com.alibaba.cloud.ai.tongyi.image;
import java.util.Objects; import java.util.Objects;
import com.alibaba.cloud.ai.tongyi.exception.TongYiImagesException; import com.alibaba.cloud.ai.tongyi.common.exception.TongYiImagesException;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis; import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis;
import org.springframework.ai.image.ImageOptions; import org.springframework.ai.image.ImageOptions;
@ -28,7 +28,7 @@ import org.springframework.ai.image.ImageOptions;
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class TongYiImagesOptions implements ImageOptions { public class TongYiImagesOptions implements ImageOptions {

@ -17,29 +17,27 @@
package com.alibaba.cloud.ai.tongyi.image; package com.alibaba.cloud.ai.tongyi.image;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis; import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty; import org.springframework.boot.context.properties.NestedConfigurationProperty;
import static com.alibaba.cloud.ai.tongyi.common.constants.TongYiConstants.SCA_AI_CONFIGURATION;
/** /**
* TongYi Image API properties. * TongYi Image API properties.
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
@ConfigurationProperties(TongYiImagesProperties.CONFIG_PREFIX) @ConfigurationProperties(TongYiImagesProperties.CONFIG_PREFIX)
public class TongYiImagesProperties { public class TongYiImagesProperties {
private final Logger logger = LoggerFactory.getLogger(TongYiImagesProperties.class);
/** /**
* Spring Cloud Alibaba AI configuration prefix. * Spring Cloud Alibaba AI configuration prefix.
*/ */
public static final String CONFIG_PREFIX = "spring.cloud.ai.tongyi.images"; public static final String CONFIG_PREFIX = SCA_AI_CONFIGURATION + "images";
/** /**
* Default TongYi Chat model. * Default TongYi Chat model.

@ -32,7 +32,7 @@ import org.springframework.util.Assert;
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class TongYiAiChatResponseMetadata extends HashMap<String, Object> implements ChatResponseMetadata { public class TongYiAiChatResponseMetadata extends HashMap<String, Object> implements ChatResponseMetadata {

@ -27,7 +27,7 @@ import org.springframework.util.Assert;
* *
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class TongYiAiUsage implements Usage { public class TongYiAiUsage implements Usage {

@ -29,7 +29,7 @@ import org.springframework.util.Assert;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class TongYiImagesResponseMetadata extends HashMap<String, Object> implements ImageResponseMetadata { public class TongYiImagesResponseMetadata extends HashMap<String, Object> implements ImageResponseMetadata {

@ -24,6 +24,7 @@ import org.springframework.ai.embedding.EmbeddingResponseMetadata;
* @author why_ohh * @author why_ohh
* @author yuluo * @author yuluo
* @author <a href="mailto:550588941@qq.com">why_ohh</a> * @author <a href="mailto:550588941@qq.com">why_ohh</a>
* @since 2023.0.1.0
*/ */
public class TongYiTextEmbeddingResponseMetadata extends EmbeddingResponseMetadata { public class TongYiTextEmbeddingResponseMetadata extends EmbeddingResponseMetadata {

@ -32,7 +32,7 @@ import org.springframework.util.Assert;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
public class TongYiAudioSpeechResponseMetadata extends HashMap<String, Object> implements ResponseMetadata { public class TongYiAudioSpeechResponseMetadata extends HashMap<String, Object> implements ResponseMetadata {

@ -21,7 +21,7 @@ import org.springframework.ai.model.ResultMetadata;
/** /**
* @author xYLiu * @author xYLiu
* @author yuluo * @author yuluo
* @since 2023.0.0.0 * @since 2023.0.1.0
*/ */
public interface TongYiAudioTranscriptionMetadata extends ResultMetadata { public interface TongYiAudioTranscriptionMetadata extends ResultMetadata {

@ -33,7 +33,7 @@ import org.springframework.util.Assert;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0 * @since 2023.0.1.0
*/ */
public class TongYiAudioTranscriptionResponseMetadata extends HashMap<String, Object> implements ResponseMetadata { public class TongYiAudioTranscriptionResponseMetadata extends HashMap<String, Object> implements ResponseMetadata {

@ -37,6 +37,7 @@ import static org.mockito.Mockito.when;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.1.0
*/ */
class TongYiAudioSpeechClientTest { class TongYiAudioSpeechClientTest {
@ -44,13 +45,13 @@ class TongYiAudioSpeechClientTest {
@Mock @Mock
private SpeechSynthesizer speechSynthesizer; private SpeechSynthesizer speechSynthesizer;
private TongYiAudioSpeechClient client; private TongYiAudioSpeechModel client;
@BeforeEach @BeforeEach
void setUp() { void setUp() {
MockitoAnnotations.openMocks(this); MockitoAnnotations.openMocks(this);
client = new TongYiAudioSpeechClient(speechSynthesizer, new TongYiAudioSpeechOptions()); client = new TongYiAudioSpeechModel(speechSynthesizer, new TongYiAudioSpeechOptions());
} }
@Test @Test

@ -29,7 +29,7 @@ import static org.assertj.core.api.Assertions.assertThat;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
class TongYiAudioSpeechOptionsTests { class TongYiAudioSpeechOptionsTests {
@ -40,7 +40,7 @@ class TongYiAudioSpeechOptionsTests {
SpeechSynthesizer mockClient = Mockito.mock(SpeechSynthesizer.class); SpeechSynthesizer mockClient = Mockito.mock(SpeechSynthesizer.class);
Constants.apiKey = "test"; Constants.apiKey = "test";
var speechClient = new TongYiAudioSpeechClient(mockClient, var speechClient = new TongYiAudioSpeechModel(mockClient,
TongYiAudioSpeechOptions.builder() TongYiAudioSpeechOptions.builder()
.withFormat(SpeechSynthesisAudioFormat.MP3) .withFormat(SpeechSynthesisAudioFormat.MP3)
.withRate(333f) .withRate(333f)

@ -28,6 +28,7 @@ import static org.assertj.core.api.Assertions.assertThat;
/** /**
* @author xYLiu * @author xYLiu
* @author yuluo * @author yuluo
* @since 2023.0.1.0
*/ */
class TongYiAudioTranscriptionOptionsTests { class TongYiAudioTranscriptionOptionsTests {
@ -38,7 +39,7 @@ class TongYiAudioTranscriptionOptionsTests {
Transcription mockClient = Mockito.mock(Transcription.class); Transcription mockClient = Mockito.mock(Transcription.class);
Constants.apiKey = "test"; Constants.apiKey = "test";
var transcription = new TongYiAudioTranscriptionClient( var transcription = new TongYiAudioTranscriptionModel(
TongYiAudioTranscriptionOptions.builder().withDiarizationEnabled(false) TongYiAudioTranscriptionOptions.builder().withDiarizationEnabled(false)
.withAudioEventDetectionEnabled(false) .withAudioEventDetectionEnabled(false)
.withTimestampAlignmentEnabled(false) .withTimestampAlignmentEnabled(false)

@ -28,7 +28,7 @@ import static org.assertj.core.api.Assertions.assertThat;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.0.0-RC1 * @since 2023.0.1.0
*/ */
class TongYiChatOptionsTests { class TongYiChatOptionsTests {
@ -41,7 +41,7 @@ class TongYiChatOptionsTests {
// Test start. // Test start.
var tongYiChatClient = new TongYiChatClient(mockClient, var tongYiChatClient = new TongYiChatModel(mockClient,
TongYiChatOptions.builder().withModel(Generation.Models.QWEN_TURBO).withTemperature(88.8).build()); TongYiChatOptions.builder().withModel(Generation.Models.QWEN_TURBO).withTemperature(88.8).build());
var tongYiChatParams = tongYiChatClient.toTongYiChatParams(new Prompt("你好")); var tongYiChatParams = tongYiChatClient.toTongYiChatParams(new Prompt("你好"));
@ -51,7 +51,7 @@ class TongYiChatOptionsTests {
assertThat(tongYiChatParams.getModel()).isEqualTo(Generation.Models.QWEN_TURBO); assertThat(tongYiChatParams.getModel()).isEqualTo(Generation.Models.QWEN_TURBO);
assertThat(tongYiChatParams.getTemperature()).isEqualTo(88.8f); assertThat(tongYiChatParams.getTemperature()).isEqualTo(88.8f);
tongYiChatClient = new TongYiChatClient(mockClient, tongYiChatClient = new TongYiChatModel(mockClient,
TongYiChatOptions.builder().withModel(Generation.Models.QWEN_MAX).withTemperature(77.7).build()); TongYiChatOptions.builder().withModel(Generation.Models.QWEN_MAX).withTemperature(77.7).build());
tongYiChatParams = tongYiChatClient.toTongYiChatParams(new Prompt("你是谁")); tongYiChatParams = tongYiChatClient.toTongYiChatParams(new Prompt("你是谁"));

@ -16,7 +16,7 @@
package com.alibaba.cloud.ai.tongyi.images; package com.alibaba.cloud.ai.tongyi.images;
import com.alibaba.cloud.ai.tongyi.image.TongYiImagesClient; import com.alibaba.cloud.ai.tongyi.image.TongYiImagesModel;
import com.alibaba.cloud.ai.tongyi.image.TongYiImagesOptions; import com.alibaba.cloud.ai.tongyi.image.TongYiImagesOptions;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis; import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisParam; import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisParam;
@ -29,6 +29,7 @@ import static org.assertj.core.api.Assertions.assertThat;
/** /**
* @author yuluo * @author yuluo
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a> * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
* @since 2023.0.1.0
*/ */
class TongYiImagesOptionsTests { class TongYiImagesOptionsTests {
@ -39,7 +40,7 @@ class TongYiImagesOptionsTests {
ImageSynthesis mockClient = Mockito.mock(ImageSynthesis.class); ImageSynthesis mockClient = Mockito.mock(ImageSynthesis.class);
Constants.apiKey = "test"; Constants.apiKey = "test";
var tongYiImagesClient = new TongYiImagesClient(mockClient, var tongYiImagesClient = new TongYiImagesModel(mockClient,
TongYiImagesOptions. TongYiImagesOptions.
builder() builder()
.withModel("test") .withModel("test")

Loading…
Cancel
Save