From cc9490f939407e812f6d714ddea1cc0cc3dc788c Mon Sep 17 00:00:00 2001 From: woosung1223 Date: Mon, 30 Sep 2024 15:06:45 +0900 Subject: [PATCH 1/7] =?UTF-8?q?:fire:=20fix:=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?=EB=AA=A8=EB=8D=B8=EB=9E=A9=EC=8A=A4=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/modellabs/MetaDataResponse.java | 26 ---------- .../agent/modellabs/ModelLabsAgent.java | 50 ------------------- .../modellabs/ModelLabsConfiguration.java | 17 ------- .../agent/modellabs/ModelLabsRequest.java | 32 ------------ .../agent/modellabs/ModelLabsResponse.java | 13 ----- 5 files changed, 138 deletions(-) delete mode 100644 src/main/java/slvtwn/khu/toyouserver/agent/modellabs/MetaDataResponse.java delete mode 100644 src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsAgent.java delete mode 100644 src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsConfiguration.java delete mode 100644 src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsRequest.java delete mode 100644 src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsResponse.java diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/MetaDataResponse.java b/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/MetaDataResponse.java deleted file mode 100644 index cd58bb8..0000000 --- a/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/MetaDataResponse.java +++ /dev/null @@ -1,26 +0,0 @@ -package slvtwn.khu.toyouserver.agent.modellabs; - -public record MetaDataResponse( - String prompt, - String model_id, - String negative_prompt, - String scheduler, - String safetychecker, - int W, - int H, - double guidance_scale, - long seed, - int steps, - int n_samples, - String full_url, - String upscale, - String panorama, - String self_attention, - String embeddings, - String lora_model, - String lora_strength, - String outdir, - String file_prefix -) { -} - diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsAgent.java b/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsAgent.java deleted file mode 100644 index dc7a60a..0000000 --- a/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsAgent.java +++ /dev/null @@ -1,50 +0,0 @@ -package slvtwn.khu.toyouserver.agent.modellabs; - -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; -import slvtwn.khu.toyouserver.agent.WebClientWrapper; - -@RequiredArgsConstructor -@Component -public class ModelLabsAgent { - - private final ModelLabsConfiguration configuration; - private final WebClientWrapper webClientWrapper; - - public List generateCoverWithKeywords(List keywords) { - ModelLabsRequest request = setupBody(keywords); - - ModelLabsResponse response = webClientWrapper.send( - configuration.getModelLabsEndPoint(), (httpHeaders -> { - }), request, ModelLabsResponse.class); - - return response.output(); - } - - private ModelLabsRequest setupBody(List keywords) { - // TODO: prompt, negative prompt, keywords - String prompt = ""; - String negativePrompt = ""; - - return ModelLabsRequest.builder() - .prompt(prompt) - .key(configuration.getKey()) - .model_id(configuration.getModelId()) - .negative_prompt(negativePrompt) - .width("512") - .height("512") - .samples("3") - .num_inference_steps("30") - .safety_checker("no") - .enhance_prompt("yes") - .guidance_scale(9) - .panorama("no") - .self_attention("no") - .upscale("no") - .tomesd("yes") - .use_karras_sigmas("yes") - .scheduler("DPMSolverMultistepScheduler") - .build(); - } -} diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsConfiguration.java b/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsConfiguration.java deleted file mode 100644 index afa6079..0000000 --- a/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsConfiguration.java +++ /dev/null @@ -1,17 +0,0 @@ -package slvtwn.khu.toyouserver.agent.modellabs; - -import lombok.Getter; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -@Getter -@Component -public class ModelLabsConfiguration { - - @Value("${model-labs.endpoint}") - private String modelLabsEndPoint; - @Value("${model-labs.key}") - private String key; - @Value("${model-labs.model-id}") - private String modelId; -} diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsRequest.java b/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsRequest.java deleted file mode 100644 index 1f1d71d..0000000 --- a/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsRequest.java +++ /dev/null @@ -1,32 +0,0 @@ -package slvtwn.khu.toyouserver.agent.modellabs; - -import lombok.Builder; - -@Builder -public record ModelLabsRequest( - String key, - String model_id, - String prompt, - String negative_prompt, - String width, - String height, - String samples, - String num_inference_steps, - String safety_checker, - String enhance_prompt, - String seed, - int guidance_scale, - String panorama, - String self_attention, - String upscale, - String embeddings_model, - String lora_model, - String tomesd, - String use_karras_sigmas, - String vae, - String lora_strength, - String scheduler, - String webhook, - String track_id -) { -} diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsResponse.java b/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsResponse.java deleted file mode 100644 index 7f9fd03..0000000 --- a/src/main/java/slvtwn/khu/toyouserver/agent/modellabs/ModelLabsResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package slvtwn.khu.toyouserver.agent.modellabs; - -import java.util.List; - -public record ModelLabsResponse( - String status, - double generationTime, - int id, - List output, - MetaDataResponse meta -) { - -} From dbabf453afb944ccef3a274360a16df6c94a79ab Mon Sep 17 00:00:00 2001 From: woosung1223 Date: Mon, 30 Sep 2024 15:13:55 +0900 Subject: [PATCH 2/7] =?UTF-8?q?:sparkles:=20feat:=20S3=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=EB=A1=9C=EC=A7=81=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ .../agent/aws/AwsConfiguration.java | 33 +++++++++++++++++ .../khu/toyouserver/agent/aws/S3Agent.java | 35 +++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 src/main/java/slvtwn/khu/toyouserver/agent/aws/AwsConfiguration.java create mode 100644 src/main/java/slvtwn/khu/toyouserver/agent/aws/S3Agent.java diff --git a/build.gradle b/build.gradle index ce5adb6..94665d2 100644 --- a/build.gradle +++ b/build.gradle @@ -56,6 +56,8 @@ dependencies { // Spring Security 설정 implementation 'org.springframework.boot:spring-boot-starter-security' + + implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' } tasks.register('importConfigSubmodule', Copy) { diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/aws/AwsConfiguration.java b/src/main/java/slvtwn/khu/toyouserver/agent/aws/AwsConfiguration.java new file mode 100644 index 0000000..626fc3e --- /dev/null +++ b/src/main/java/slvtwn/khu/toyouserver/agent/aws/AwsConfiguration.java @@ -0,0 +1,33 @@ +package slvtwn.khu.toyouserver.agent.aws; + +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Getter +@Configuration +public class AwsConfiguration { + + @Value("cloud.aws.credentials.access-key") + private String accessKey; + @Value("cloud.aws.credentials.secret-key") + private String secretKey; + @Value("cloud.aws.region.static") + private String region; + @Value("${cloud.aws.s3.bucket}") + private String bucket; + + @Bean + public AmazonS3Client amazonS3Client() { + BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); + return (AmazonS3Client) AmazonS3ClientBuilder.standard() + .withRegion(region) + .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) + .build(); + } +} diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/aws/S3Agent.java b/src/main/java/slvtwn/khu/toyouserver/agent/aws/S3Agent.java new file mode 100644 index 0000000..a0c188a --- /dev/null +++ b/src/main/java/slvtwn/khu/toyouserver/agent/aws/S3Agent.java @@ -0,0 +1,35 @@ +package slvtwn.khu.toyouserver.agent.aws; + +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.PutObjectRequest; +import java.io.ByteArrayInputStream; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import slvtwn.khu.toyouserver.common.response.ResponseType; +import slvtwn.khu.toyouserver.exception.ToyouException; + +@RequiredArgsConstructor +@Component +public class S3Agent { + + private final AmazonS3Client amazonS3Client; + private final AwsConfiguration configuration; + + public String uploadFile(byte[] fileData, String fileName, String contentType) { + try { + String fileUrl = "https://" + configuration.getBucket() + "/to-you/" + fileName; + + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentType(contentType); + metadata.setContentLength(fileData.length); + + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData); + amazonS3Client.putObject(new PutObjectRequest(configuration.getBucket(), fileName, byteArrayInputStream, metadata)); + + return fileUrl; + } catch (Exception e) { + throw new ToyouException(ResponseType.INTERNAL_SERVER_ERROR); + } + } +} From 93a50714b36333f7a85082c1992f60a9ff858698 Mon Sep 17 00:00:00 2001 From: woosung1223 Date: Mon, 30 Sep 2024 15:14:03 +0900 Subject: [PATCH 3/7] =?UTF-8?q?:sparkles:=20feat:=20=EC=8A=A4=ED=8B=B0?= =?UTF-8?q?=EC=BB=A4=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/model/StickerModelAgent.java | 33 +++++++++++ .../model/StickerModelConfiguration.java | 13 +++++ .../agent/model/StickerModelRequest.java | 5 ++ .../agent/model/StickerModelResponse.java | 7 +++ .../toyouserver/application/AgentService.java | 18 +++++- .../application/RollingPaperService.java | 16 +++--- .../dto/GenerateStickerRequest.java | 5 ++ .../dto/GenerateStickerResponse.java | 7 +++ .../presentation/AgentController.java | 12 +++- .../presentation/RollingPaperController.java | 2 + .../application/RollingPaperServiceTest.java | 55 +++++++++---------- 11 files changed, 132 insertions(+), 41 deletions(-) create mode 100644 src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelAgent.java create mode 100644 src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelConfiguration.java create mode 100644 src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelRequest.java create mode 100644 src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelResponse.java create mode 100644 src/main/java/slvtwn/khu/toyouserver/dto/GenerateStickerRequest.java create mode 100644 src/main/java/slvtwn/khu/toyouserver/dto/GenerateStickerResponse.java diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelAgent.java b/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelAgent.java new file mode 100644 index 0000000..76cb6c6 --- /dev/null +++ b/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelAgent.java @@ -0,0 +1,33 @@ +package slvtwn.khu.toyouserver.agent.model; + +import java.util.Base64; +import java.util.List; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import slvtwn.khu.toyouserver.agent.WebClientWrapper; +import slvtwn.khu.toyouserver.agent.aws.S3Agent; + +@RequiredArgsConstructor +@Component +public class StickerModelAgent { + + private static final String STICKER_MIME_TYPE = "image/png"; + + private final StickerModelConfiguration configuration; + + private final WebClientWrapper webClientWrapper; + private final S3Agent s3Agent; + + public List generateStickerUrls(StickerModelRequest request) { + StickerModelResponse response = webClientWrapper.send( + configuration.getEndpoint(), (httpHeaders -> { + }), request, StickerModelResponse.class + ); + + return response.base64EncodedImages().stream() + .map(each -> Base64.getDecoder().decode(each)) + .map(each -> s3Agent.uploadFile(each, UUID.nameUUIDFromBytes(each).toString(), STICKER_MIME_TYPE)) + .toList(); + } +} diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelConfiguration.java b/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelConfiguration.java new file mode 100644 index 0000000..e839f3d --- /dev/null +++ b/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelConfiguration.java @@ -0,0 +1,13 @@ +package slvtwn.khu.toyouserver.agent.model; + +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Getter +@Component +public class StickerModelConfiguration { + + @Value("sticker-model.endpoint") + private String endpoint; +} diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelRequest.java b/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelRequest.java new file mode 100644 index 0000000..92bd737 --- /dev/null +++ b/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelRequest.java @@ -0,0 +1,5 @@ +package slvtwn.khu.toyouserver.agent.model; + +public record StickerModelRequest(String prompt, String color) { + +} diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelResponse.java b/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelResponse.java new file mode 100644 index 0000000..1596f6b --- /dev/null +++ b/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelResponse.java @@ -0,0 +1,7 @@ +package slvtwn.khu.toyouserver.agent.model; + +import java.util.List; + +public record StickerModelResponse(List base64EncodedImages) { + +} diff --git a/src/main/java/slvtwn/khu/toyouserver/application/AgentService.java b/src/main/java/slvtwn/khu/toyouserver/application/AgentService.java index 5fc46fd..621e75f 100644 --- a/src/main/java/slvtwn/khu/toyouserver/application/AgentService.java +++ b/src/main/java/slvtwn/khu/toyouserver/application/AgentService.java @@ -6,6 +6,10 @@ import org.springframework.stereotype.Service; import slvtwn.khu.toyouserver.agent.gpt.ChatGptAgent; import slvtwn.khu.toyouserver.agent.gpt.ChatGptResponse; +import slvtwn.khu.toyouserver.agent.model.StickerModelAgent; +import slvtwn.khu.toyouserver.agent.model.StickerModelRequest; +import slvtwn.khu.toyouserver.dto.GenerateStickerRequest; +import slvtwn.khu.toyouserver.dto.GenerateStickerResponse; import slvtwn.khu.toyouserver.dto.KeywordRequest; import slvtwn.khu.toyouserver.dto.KeywordResponse; @@ -13,13 +17,21 @@ @Service public class AgentService { + private final StickerModelAgent stickerModelAgent; private final ChatGptAgent chatGptAgent; + public GenerateStickerResponse generateStickers(GenerateStickerRequest request) { + List urls = stickerModelAgent.generateStickerUrls( + new StickerModelRequest(request.prompt(), request.color())); + + return new GenerateStickerResponse(urls); + } + public KeywordResponse generateKeywords(KeywordRequest request) { String content = request.content(); String prompt = String.format(""" Suggest 3 keywords that could represent emotions or characteristics in the content. - + content: @@ -31,7 +43,7 @@ public KeywordResponse generateKeywords(KeywordRequest request) { 반가움, 기대, 아쉬움 - + content: @@ -42,7 +54,7 @@ public KeywordResponse generateKeywords(KeywordRequest request) { 축하, 아쉬움, 즐거움 - + content: %s keywords: """, content); diff --git a/src/main/java/slvtwn/khu/toyouserver/application/RollingPaperService.java b/src/main/java/slvtwn/khu/toyouserver/application/RollingPaperService.java index a0c6f05..ab2be80 100644 --- a/src/main/java/slvtwn/khu/toyouserver/application/RollingPaperService.java +++ b/src/main/java/slvtwn/khu/toyouserver/application/RollingPaperService.java @@ -5,7 +5,6 @@ import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import slvtwn.khu.toyouserver.agent.modellabs.ModelLabsAgent; import slvtwn.khu.toyouserver.common.response.ResponseType; import slvtwn.khu.toyouserver.domain.Member; import slvtwn.khu.toyouserver.domain.RollingPaper; @@ -31,17 +30,18 @@ public class RollingPaperService { private final RollingPaperRepository rollingPaperRepository; private final StickerRepository stickerRepository; private final MemberRepository memberRepository; - private final ModelLabsAgent modelLabsAgent; private final RollingPaperRepository rollingpaperRepository; private final UserRepository userRepository; + // TODO: ModelLabs 관련 문제로 DISABLED + @Deprecated public void generateCoverImageAndUpdateRollingPaper(CoverRequest request, Long rollingPaperId) { - List keywords = request.keywords(); - String coverImageUrl = modelLabsAgent.generateCoverWithKeywords(keywords) - .get(FIRST_COVER_IMAGE); - RollingPaper rollingPaper = rollingpaperRepository.findById(rollingPaperId) - .orElseThrow(() -> new ToyouException(ResponseType.BAD_REQUEST)); - rollingPaper.updateCoverImage(coverImageUrl); +// List keywords = request.keywords(); +// String coverImageUrl = modelLabsAgent.generateCoverWithKeywords(keywords) +// .get(FIRST_COVER_IMAGE); +// RollingPaper rollingPaper = rollingpaperRepository.findById(rollingPaperId) +// .orElseThrow(() -> new ToyouException(ResponseType.BAD_REQUEST)); +// rollingPaper.updateCoverImage(coverImageUrl); } public void sendRollingPaper(Long recipientUserId, RollingPaperRequest request) { diff --git a/src/main/java/slvtwn/khu/toyouserver/dto/GenerateStickerRequest.java b/src/main/java/slvtwn/khu/toyouserver/dto/GenerateStickerRequest.java new file mode 100644 index 0000000..ee7d800 --- /dev/null +++ b/src/main/java/slvtwn/khu/toyouserver/dto/GenerateStickerRequest.java @@ -0,0 +1,5 @@ +package slvtwn.khu.toyouserver.dto; + +public record GenerateStickerRequest(String prompt, String color) { + +} diff --git a/src/main/java/slvtwn/khu/toyouserver/dto/GenerateStickerResponse.java b/src/main/java/slvtwn/khu/toyouserver/dto/GenerateStickerResponse.java new file mode 100644 index 0000000..3b84700 --- /dev/null +++ b/src/main/java/slvtwn/khu/toyouserver/dto/GenerateStickerResponse.java @@ -0,0 +1,7 @@ +package slvtwn.khu.toyouserver.dto; + +import java.util.List; + +public record GenerateStickerResponse(List stickers) { + +} diff --git a/src/main/java/slvtwn/khu/toyouserver/presentation/AgentController.java b/src/main/java/slvtwn/khu/toyouserver/presentation/AgentController.java index a33b227..136543e 100644 --- a/src/main/java/slvtwn/khu/toyouserver/presentation/AgentController.java +++ b/src/main/java/slvtwn/khu/toyouserver/presentation/AgentController.java @@ -6,6 +6,8 @@ import org.springframework.web.bind.annotation.RestController; import slvtwn.khu.toyouserver.application.AgentService; import slvtwn.khu.toyouserver.common.response.ToyouResponse; +import slvtwn.khu.toyouserver.dto.GenerateStickerRequest; +import slvtwn.khu.toyouserver.dto.GenerateStickerResponse; import slvtwn.khu.toyouserver.dto.KeywordRequest; import slvtwn.khu.toyouserver.dto.KeywordResponse; @@ -15,9 +17,15 @@ public class AgentController { private final AgentService agentService; + @PostMapping("/generate-stickers") + public ToyouResponse generateStickers(@RequestBody GenerateStickerRequest request) { + GenerateStickerResponse response = agentService.generateStickers(request); + return ToyouResponse.from(response); + } + @PostMapping("/generate-keywords") - public ToyouResponse generateKeywords(@RequestBody KeywordRequest keywordRequest) { - KeywordResponse response = agentService.generateKeywords(keywordRequest); + public ToyouResponse generateKeywords(@RequestBody KeywordRequest request) { + KeywordResponse response = agentService.generateKeywords(request); return ToyouResponse.from(response); } } diff --git a/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java b/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java index 36d4bb9..e3f7a02 100644 --- a/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java +++ b/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java @@ -43,6 +43,8 @@ public ToyouResponse sendRollingPaper(@UserAuthentication Long RequestUser return ToyouResponse.noContent(); } + // TODO: ModelLabs 관련 문제로 DISABLED + @Deprecated @PostMapping("/rollingpapers/{rollingPaperId}/generate-cover") public ToyouResponse generateCoverImage(@UserAuthentication Long userId, @PathVariable Long rollingPaperId, diff --git a/src/test/java/slvtwn/khu/toyouserver/application/RollingPaperServiceTest.java b/src/test/java/slvtwn/khu/toyouserver/application/RollingPaperServiceTest.java index adc6b8c..74b6ce0 100644 --- a/src/test/java/slvtwn/khu/toyouserver/application/RollingPaperServiceTest.java +++ b/src/test/java/slvtwn/khu/toyouserver/application/RollingPaperServiceTest.java @@ -16,7 +16,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; -import slvtwn.khu.toyouserver.agent.modellabs.ModelLabsAgent; import slvtwn.khu.toyouserver.domain.Group; import slvtwn.khu.toyouserver.domain.Member; import slvtwn.khu.toyouserver.domain.RollingPaper; @@ -34,37 +33,37 @@ class RollingPaperServiceTest { @PersistenceContext private EntityManager entityManager; - @MockBean - private ModelLabsAgent modelLabsAgent; +// @MockBean +// private ModelLabsAgent modelLabsAgent; @Autowired private RollingPaperService rollingPaperService; - @Test - void 커버_이미지를_생성하면_롤링페이퍼_커버가_업데이트된다() { - // given - Group group = new Group("name"); - User user = new User("name", LocalDate.now(), "introduction", "profile_picture", null); - Member member = new Member(user, group); - RollingPaper rollingPaper = new RollingPaper(null, "title", "content", 1L, member); - - entityManager.persist(user); - entityManager.persist(group); - entityManager.persist(member); - entityManager.persist(rollingPaper); - - String coverImageUrl = "cover_image_url"; - CoverRequest request = new CoverRequest(List.of()); - - given(modelLabsAgent.generateCoverWithKeywords(any())) - .willReturn(List.of(coverImageUrl)); - - // when - rollingPaperService.generateCoverImageAndUpdateRollingPaper(request, rollingPaper.getId()); - - // then - assertThat(rollingPaper.getCoverImageUrl()).isEqualTo(coverImageUrl); - } +// @Test +// void 커버_이미지를_생성하면_롤링페이퍼_커버가_업데이트된다() { +// // given +// Group group = new Group("name"); +// User user = new User("name", LocalDate.now(), "introduction", "profile_picture", null); +// Member member = new Member(user, group); +// RollingPaper rollingPaper = new RollingPaper(null, "title", "content", 1L, member); +// +// entityManager.persist(user); +// entityManager.persist(group); +// entityManager.persist(member); +// entityManager.persist(rollingPaper); +// +// String coverImageUrl = "cover_image_url"; +// CoverRequest request = new CoverRequest(List.of()); +// +// given(modelLabsAgent.generateCoverWithKeywords(any())) +// .willReturn(List.of(coverImageUrl)); +// +// // when +// rollingPaperService.generateCoverImageAndUpdateRollingPaper(request, rollingPaper.getId()); +// +// // then +// assertThat(rollingPaper.getCoverImageUrl()).isEqualTo(coverImageUrl); +// } @Test void 롤링페이퍼를_전송할_수_있다() { From 5f6df483952afd3ce1c5406b00814d541fa5bf38 Mon Sep 17 00:00:00 2001 From: woosung1223 Date: Mon, 30 Sep 2024 15:48:47 +0900 Subject: [PATCH 4/7] =?UTF-8?q?:sparkles:=20refactor:=20Agent=EC=97=90?= =?UTF-8?q?=EC=84=9C=EB=8A=94=20=EB=B0=94=EC=9D=B4=ED=8A=B8=EC=97=B4?= =?UTF-8?q?=EC=9D=84=20=EB=B0=98=ED=99=98=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=B1=85=EC=9E=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../khu/toyouserver/agent/aws/AwsConfiguration.java | 6 +++--- .../khu/toyouserver/agent/model/StickerModelAgent.java | 8 +------- .../agent/model/StickerModelConfiguration.java | 2 +- .../khu/toyouserver/application/AgentService.java | 10 ++++++++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/aws/AwsConfiguration.java b/src/main/java/slvtwn/khu/toyouserver/agent/aws/AwsConfiguration.java index 626fc3e..bab7382 100644 --- a/src/main/java/slvtwn/khu/toyouserver/agent/aws/AwsConfiguration.java +++ b/src/main/java/slvtwn/khu/toyouserver/agent/aws/AwsConfiguration.java @@ -13,11 +13,11 @@ @Configuration public class AwsConfiguration { - @Value("cloud.aws.credentials.access-key") + @Value("${cloud.aws.credentials.access-key}") private String accessKey; - @Value("cloud.aws.credentials.secret-key") + @Value("${cloud.aws.credentials.secret-key}") private String secretKey; - @Value("cloud.aws.region.static") + @Value("${cloud.aws.region.static}") private String region; @Value("${cloud.aws.s3.bucket}") private String bucket; diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelAgent.java b/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelAgent.java index 76cb6c6..10260d6 100644 --- a/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelAgent.java +++ b/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelAgent.java @@ -2,24 +2,19 @@ import java.util.Base64; import java.util.List; -import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import slvtwn.khu.toyouserver.agent.WebClientWrapper; -import slvtwn.khu.toyouserver.agent.aws.S3Agent; @RequiredArgsConstructor @Component public class StickerModelAgent { - private static final String STICKER_MIME_TYPE = "image/png"; - private final StickerModelConfiguration configuration; private final WebClientWrapper webClientWrapper; - private final S3Agent s3Agent; - public List generateStickerUrls(StickerModelRequest request) { + public List generateStickers(StickerModelRequest request) { StickerModelResponse response = webClientWrapper.send( configuration.getEndpoint(), (httpHeaders -> { }), request, StickerModelResponse.class @@ -27,7 +22,6 @@ public List generateStickerUrls(StickerModelRequest request) { return response.base64EncodedImages().stream() .map(each -> Base64.getDecoder().decode(each)) - .map(each -> s3Agent.uploadFile(each, UUID.nameUUIDFromBytes(each).toString(), STICKER_MIME_TYPE)) .toList(); } } diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelConfiguration.java b/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelConfiguration.java index e839f3d..0533cf9 100644 --- a/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelConfiguration.java +++ b/src/main/java/slvtwn/khu/toyouserver/agent/model/StickerModelConfiguration.java @@ -8,6 +8,6 @@ @Component public class StickerModelConfiguration { - @Value("sticker-model.endpoint") + @Value("${sticker-model.endpoint}") private String endpoint; } diff --git a/src/main/java/slvtwn/khu/toyouserver/application/AgentService.java b/src/main/java/slvtwn/khu/toyouserver/application/AgentService.java index 621e75f..1a9ad8c 100644 --- a/src/main/java/slvtwn/khu/toyouserver/application/AgentService.java +++ b/src/main/java/slvtwn/khu/toyouserver/application/AgentService.java @@ -2,8 +2,10 @@ import java.util.Arrays; import java.util.List; +import java.util.UUID; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import slvtwn.khu.toyouserver.agent.aws.S3Agent; import slvtwn.khu.toyouserver.agent.gpt.ChatGptAgent; import slvtwn.khu.toyouserver.agent.gpt.ChatGptResponse; import slvtwn.khu.toyouserver.agent.model.StickerModelAgent; @@ -17,12 +19,16 @@ @Service public class AgentService { + private static final String STICKER_MIME_TYPE = "image/png"; + private final StickerModelAgent stickerModelAgent; private final ChatGptAgent chatGptAgent; + private final S3Agent s3Agent; public GenerateStickerResponse generateStickers(GenerateStickerRequest request) { - List urls = stickerModelAgent.generateStickerUrls( - new StickerModelRequest(request.prompt(), request.color())); + List urls = stickerModelAgent.generateStickers(new StickerModelRequest(request.prompt(), request.color())).stream() + .map(each -> s3Agent.uploadFile(each, UUID.nameUUIDFromBytes(each).toString(), STICKER_MIME_TYPE)) + .toList(); return new GenerateStickerResponse(urls); } From 609f33cf16e80f308a4054de99919a19f2dc8885 Mon Sep 17 00:00:00 2001 From: woosung1223 Date: Mon, 30 Sep 2024 16:14:19 +0900 Subject: [PATCH 5/7] =?UTF-8?q?:sparkles:=20feat:=20S3,=20=EC=8A=A4?= =?UTF-8?q?=ED=8B=B0=EC=BB=A4=20=EC=83=9D=EC=84=B1=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- toyou-server-config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toyou-server-config b/toyou-server-config index d16c870..a5e3fc8 160000 --- a/toyou-server-config +++ b/toyou-server-config @@ -1 +1 @@ -Subproject commit d16c870f250210bf0ec44bbffe8a0397a43588c5 +Subproject commit a5e3fc8b5f6db092a27238396fd3f298c3e639b7 From 6e3a76784393ec88b328627d0d1fdfde0265ad99 Mon Sep 17 00:00:00 2001 From: woosung1223 Date: Mon, 30 Sep 2024 16:14:35 +0900 Subject: [PATCH 6/7] =?UTF-8?q?:art:=20refactor:=20S3=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/slvtwn/khu/toyouserver/agent/aws/S3Agent.java | 8 +++++--- .../slvtwn/khu/toyouserver/application/AgentService.java | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/slvtwn/khu/toyouserver/agent/aws/S3Agent.java b/src/main/java/slvtwn/khu/toyouserver/agent/aws/S3Agent.java index a0c188a..827ac60 100644 --- a/src/main/java/slvtwn/khu/toyouserver/agent/aws/S3Agent.java +++ b/src/main/java/slvtwn/khu/toyouserver/agent/aws/S3Agent.java @@ -18,8 +18,6 @@ public class S3Agent { public String uploadFile(byte[] fileData, String fileName, String contentType) { try { - String fileUrl = "https://" + configuration.getBucket() + "/to-you/" + fileName; - ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(contentType); metadata.setContentLength(fileData.length); @@ -27,9 +25,13 @@ public String uploadFile(byte[] fileData, String fileName, String contentType) { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData); amazonS3Client.putObject(new PutObjectRequest(configuration.getBucket(), fileName, byteArrayInputStream, metadata)); - return fileUrl; + return fileName; } catch (Exception e) { throw new ToyouException(ResponseType.INTERNAL_SERVER_ERROR); } } + + public String getUrl(String key) { + return amazonS3Client.getResourceUrl(configuration.getBucket(), key); + } } diff --git a/src/main/java/slvtwn/khu/toyouserver/application/AgentService.java b/src/main/java/slvtwn/khu/toyouserver/application/AgentService.java index 1a9ad8c..eea5b2a 100644 --- a/src/main/java/slvtwn/khu/toyouserver/application/AgentService.java +++ b/src/main/java/slvtwn/khu/toyouserver/application/AgentService.java @@ -28,6 +28,7 @@ public class AgentService { public GenerateStickerResponse generateStickers(GenerateStickerRequest request) { List urls = stickerModelAgent.generateStickers(new StickerModelRequest(request.prompt(), request.color())).stream() .map(each -> s3Agent.uploadFile(each, UUID.nameUUIDFromBytes(each).toString(), STICKER_MIME_TYPE)) + .map(s3Agent::getUrl) .toList(); return new GenerateStickerResponse(urls); From 41370e9f65bc86d497589cddc8ca0560a91d5c5f Mon Sep 17 00:00:00 2001 From: woosung1223 Date: Mon, 30 Sep 2024 16:18:52 +0900 Subject: [PATCH 7/7] =?UTF-8?q?:art:=20refactor:=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=9A=A9=20yml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/application.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 48441f8..5fc4e5c 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -34,7 +34,15 @@ openai: endpoint: test model: gpt-4o-mini -model-labs: - endpoint: test - key: test - model-id: test \ No newline at end of file +sticker-model: + endpoint: abc + +cloud: + aws: + credentials: + access-key: abc + secret-key: abc + region: + static: abc + s3: + bucket: abc