From 5cef6794cd894d72c43df7efc9f2f6ad1979d704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=99=98?= Date: Sat, 23 Aug 2025 17:18:08 +0900 Subject: [PATCH 1/4] :sparkles: Feature: create prompt --- .../prompt/controller/PromptController.kt | 26 +++++++++++++++++++ .../domain/prompt/dto/PromptRequestDTO.kt | 9 +++++++ .../domain/prompt/dto/PromptResponseDTO.kt | 15 +++++++++++ .../ragback/domain/prompt/entity/Prompt.kt | 13 ++++++++++ .../prompt/repository/PromptRepository.kt | 6 +++++ .../domain/prompt/service/PromptService.kt | 24 +++++++++++++++++ 6 files changed, 93 insertions(+) create mode 100644 src/main/kotlin/simplerag/ragback/domain/prompt/controller/PromptController.kt create mode 100644 src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt create mode 100644 src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptResponseDTO.kt create mode 100644 src/main/kotlin/simplerag/ragback/domain/prompt/repository/PromptRepository.kt create mode 100644 src/main/kotlin/simplerag/ragback/domain/prompt/service/PromptService.kt diff --git a/src/main/kotlin/simplerag/ragback/domain/prompt/controller/PromptController.kt b/src/main/kotlin/simplerag/ragback/domain/prompt/controller/PromptController.kt new file mode 100644 index 0000000..6c46291 --- /dev/null +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/controller/PromptController.kt @@ -0,0 +1,26 @@ +package simplerag.ragback.domain.prompt.controller + +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController +import simplerag.ragback.domain.prompt.dto.PromptCreateRequest +import simplerag.ragback.domain.prompt.dto.PromptPreviewResponse +import simplerag.ragback.domain.prompt.service.PromptService +import simplerag.ragback.global.response.ApiResponse + +@RestController +@RequestMapping("/api/v1/prompts") +class PromptController( + private val promptService: PromptService +) { + + @PostMapping + fun createPrompt( + @RequestBody promptCreateRequest: PromptCreateRequest + ): ApiResponse { + val savedPrompt = promptService.createPrompt(promptCreateRequest) + return ApiResponse.ok(savedPrompt) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt b/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt new file mode 100644 index 0000000..1217e8a --- /dev/null +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt @@ -0,0 +1,9 @@ +package simplerag.ragback.domain.prompt.dto + +import simplerag.ragback.domain.prompt.entity.enums.PreSet + +data class PromptCreateRequest( + val name: String, + val preSet: PreSet, + val systemPrompt: String, +) \ No newline at end of file diff --git a/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptResponseDTO.kt b/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptResponseDTO.kt new file mode 100644 index 0000000..43d73ff --- /dev/null +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptResponseDTO.kt @@ -0,0 +1,15 @@ +package simplerag.ragback.domain.prompt.dto + +import simplerag.ragback.domain.prompt.entity.Prompt + +data class PromptPreviewResponse( + val id: Long, +) { + companion object { + fun from( + prompt: Prompt + ): PromptPreviewResponse { + return PromptPreviewResponse(prompt.id) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/simplerag/ragback/domain/prompt/entity/Prompt.kt b/src/main/kotlin/simplerag/ragback/domain/prompt/entity/Prompt.kt index 0fd5cc2..8174669 100644 --- a/src/main/kotlin/simplerag/ragback/domain/prompt/entity/Prompt.kt +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/entity/Prompt.kt @@ -1,6 +1,7 @@ package simplerag.ragback.domain.prompt.entity import jakarta.persistence.* +import simplerag.ragback.domain.prompt.dto.PromptCreateRequest import simplerag.ragback.domain.prompt.entity.enums.PreSet import simplerag.ragback.global.entity.BaseEntity @@ -23,4 +24,16 @@ class Prompt( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "prompts_id") val id: Long = 0 + + companion object { + fun from( + promptCreateRequest: PromptCreateRequest + ): Prompt { + return Prompt( + promptCreateRequest.name, + promptCreateRequest.preSet, + promptCreateRequest.systemPrompt + ) + } + } } \ No newline at end of file diff --git a/src/main/kotlin/simplerag/ragback/domain/prompt/repository/PromptRepository.kt b/src/main/kotlin/simplerag/ragback/domain/prompt/repository/PromptRepository.kt new file mode 100644 index 0000000..fb893ff --- /dev/null +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/repository/PromptRepository.kt @@ -0,0 +1,6 @@ +package simplerag.ragback.domain.prompt.repository + +import org.springframework.data.jpa.repository.JpaRepository +import simplerag.ragback.domain.prompt.entity.Prompt + +interface PromptRepository: JpaRepository \ No newline at end of file diff --git a/src/main/kotlin/simplerag/ragback/domain/prompt/service/PromptService.kt b/src/main/kotlin/simplerag/ragback/domain/prompt/service/PromptService.kt new file mode 100644 index 0000000..acb988d --- /dev/null +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/service/PromptService.kt @@ -0,0 +1,24 @@ +package simplerag.ragback.domain.prompt.service + +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import simplerag.ragback.domain.prompt.dto.PromptCreateRequest +import simplerag.ragback.domain.prompt.dto.PromptPreviewResponse +import simplerag.ragback.domain.prompt.entity.Prompt +import simplerag.ragback.domain.prompt.repository.PromptRepository + +@Service +@Transactional(readOnly = true) +class PromptService( + private val promptRepository: PromptRepository +) { + + @Transactional + fun createPrompt( + promptCreateRequest: PromptCreateRequest + ): PromptPreviewResponse { + val prompt = Prompt.from(promptCreateRequest) + val savedPrompt = promptRepository.save(prompt) + return PromptPreviewResponse.from(savedPrompt) + } +} \ No newline at end of file From 5575d8422b304c00ca1f6c847b0080a650821710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=99=98?= Date: Sat, 23 Aug 2025 18:23:32 +0900 Subject: [PATCH 2/4] :sparkles: Feature: add prompt detail --- .../domain/prompt/dto/PromptRequestDTO.kt | 1 + .../ragback/domain/prompt/entity/Prompt.kt | 25 ++++++-- .../domain/prompt/entity/enums/PreSet.kt | 64 ++++++++++++++++++- 3 files changed, 81 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt b/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt index 1217e8a..448dae3 100644 --- a/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt @@ -2,6 +2,7 @@ package simplerag.ragback.domain.prompt.dto import simplerag.ragback.domain.prompt.entity.enums.PreSet + data class PromptCreateRequest( val name: String, val preSet: PreSet, diff --git a/src/main/kotlin/simplerag/ragback/domain/prompt/entity/Prompt.kt b/src/main/kotlin/simplerag/ragback/domain/prompt/entity/Prompt.kt index 8174669..637d652 100644 --- a/src/main/kotlin/simplerag/ragback/domain/prompt/entity/Prompt.kt +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/entity/Prompt.kt @@ -1,8 +1,8 @@ package simplerag.ragback.domain.prompt.entity +import simplerag.ragback.domain.prompt.entity.enums.PreSet import jakarta.persistence.* import simplerag.ragback.domain.prompt.dto.PromptCreateRequest -import simplerag.ragback.domain.prompt.entity.enums.PreSet import simplerag.ragback.global.entity.BaseEntity @Entity @@ -20,7 +20,7 @@ class Prompt( @Lob val systemPrompt: String, -) : BaseEntity() { + ) : BaseEntity() { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "prompts_id") val id: Long = 0 @@ -29,11 +29,22 @@ class Prompt( fun from( promptCreateRequest: PromptCreateRequest ): Prompt { - return Prompt( - promptCreateRequest.name, - promptCreateRequest.preSet, - promptCreateRequest.systemPrompt - ) + + val prompt = if (promptCreateRequest.preSet == PreSet.CUSTOM) { + Prompt( + promptCreateRequest.name, + promptCreateRequest.preSet, + promptCreateRequest.systemPrompt + ) + } else { + Prompt( + promptCreateRequest.name, + promptCreateRequest.preSet, + promptCreateRequest.preSet.defaultSystemPrompt + ) + } + + return prompt } } } \ No newline at end of file diff --git a/src/main/kotlin/simplerag/ragback/domain/prompt/entity/enums/PreSet.kt b/src/main/kotlin/simplerag/ragback/domain/prompt/entity/enums/PreSet.kt index 21dab94..c812a88 100644 --- a/src/main/kotlin/simplerag/ragback/domain/prompt/entity/enums/PreSet.kt +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/entity/enums/PreSet.kt @@ -1,5 +1,65 @@ package simplerag.ragback.domain.prompt.entity.enums -enum class PreSet { - NONE +enum class PreSet( + val description: String, + val defaultSystemPrompt: String +) { + CUSTOM( + "User-defined custom prompt", + "TODO: custom system prompt here" + ), + + // Retrieval / Q&A + RAG_QA( + "Question Answering with retrieved context", + "TODO: system prompt for RAG_QA" + ), + RAG_SUMMARIZER( + "Summarize documents retrieved via RAG", + "TODO: system prompt for RAG_SUMMARIZER" + ), + + // Code related + CODE_REVIEW_BACKEND( + "Backend code review (Java/Kotlin/Spring)", + "TODO: system prompt for CODE_REVIEW_BACKEND" + ), + CODE_REVIEW_GENERAL( + "General code review and best practices", + "TODO: system prompt for CODE_REVIEW_GENERAL" + ), + + // Language tasks + TRANSLATION_EN_KO( + "English ↔ Korean translation", + "TODO: system prompt for TRANSLATION_EN_KO" + ), + TRANSLATION_MULTI( + "Multi-language translation", + "TODO: system prompt for TRANSLATION_MULTI" + ), + PROOFREAD_KR( + "Korean proofreading / grammar correction", + "TODO: system prompt for PROOFREAD_KR" + ), + + // Content tasks + TEXT_SUMMARIZER( + "General text summarization", + "TODO: system prompt for TEXT_SUMMARIZER" + ), + DATA_CLEANER( + "Text cleaning and preprocessing", + "TODO: system prompt for DATA_CLEANER" + ), + EMAIL_WRITER( + "Email / message generation", + "TODO: system prompt for EMAIL_WRITER" + ), + + // Safety / Guardrails + SAFETY_FILTERED( + "Safe response (avoid harmful or unsafe outputs)", + "TODO: system prompt for SAFETY_FILTERED" + ) } From 1a6f89eb18a247d4a95dd20f44233d9637c25f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=99=98?= Date: Sat, 23 Aug 2025 18:37:00 +0900 Subject: [PATCH 3/4] :sparkles: Feature: add dto valid --- .../ragback/domain/prompt/controller/PromptController.kt | 3 ++- .../simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/simplerag/ragback/domain/prompt/controller/PromptController.kt b/src/main/kotlin/simplerag/ragback/domain/prompt/controller/PromptController.kt index 6c46291..41ea85e 100644 --- a/src/main/kotlin/simplerag/ragback/domain/prompt/controller/PromptController.kt +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/controller/PromptController.kt @@ -1,5 +1,6 @@ package simplerag.ragback.domain.prompt.controller +import jakarta.validation.Valid import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping @@ -17,7 +18,7 @@ class PromptController( @PostMapping fun createPrompt( - @RequestBody promptCreateRequest: PromptCreateRequest + @RequestBody @Valid promptCreateRequest: PromptCreateRequest ): ApiResponse { val savedPrompt = promptService.createPrompt(promptCreateRequest) return ApiResponse.ok(savedPrompt) diff --git a/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt b/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt index 448dae3..95ea0b1 100644 --- a/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt @@ -1,10 +1,13 @@ package simplerag.ragback.domain.prompt.dto +import jakarta.validation.constraints.Size import simplerag.ragback.domain.prompt.entity.enums.PreSet data class PromptCreateRequest( + @field:Size(max = 100) val name: String, val preSet: PreSet, + @field:Size(max = 20000) val systemPrompt: String, ) \ No newline at end of file From abdde093421a585fa3ab043c72f6282fe579bbb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=99=98?= Date: Sat, 23 Aug 2025 18:38:05 +0900 Subject: [PATCH 4/4] :sparkles: Feature: add response code --- .../ragback/domain/prompt/controller/PromptController.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/simplerag/ragback/domain/prompt/controller/PromptController.kt b/src/main/kotlin/simplerag/ragback/domain/prompt/controller/PromptController.kt index 41ea85e..368f39f 100644 --- a/src/main/kotlin/simplerag/ragback/domain/prompt/controller/PromptController.kt +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/controller/PromptController.kt @@ -1,10 +1,8 @@ package simplerag.ragback.domain.prompt.controller import jakarta.validation.Valid -import org.springframework.web.bind.annotation.PostMapping -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.* import simplerag.ragback.domain.prompt.dto.PromptCreateRequest import simplerag.ragback.domain.prompt.dto.PromptPreviewResponse import simplerag.ragback.domain.prompt.service.PromptService @@ -17,6 +15,7 @@ class PromptController( ) { @PostMapping + @ResponseStatus(HttpStatus.CREATED) fun createPrompt( @RequestBody @Valid promptCreateRequest: PromptCreateRequest ): ApiResponse {