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..368f39f --- /dev/null +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/controller/PromptController.kt @@ -0,0 +1,26 @@ +package simplerag.ragback.domain.prompt.controller + +import jakarta.validation.Valid +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 +import simplerag.ragback.global.response.ApiResponse + +@RestController +@RequestMapping("/api/v1/prompts") +class PromptController( + private val promptService: PromptService +) { + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + fun createPrompt( + @RequestBody @Valid 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..95ea0b1 --- /dev/null +++ b/src/main/kotlin/simplerag/ragback/domain/prompt/dto/PromptRequestDTO.kt @@ -0,0 +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 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..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,7 +1,8 @@ package simplerag.ragback.domain.prompt.entity -import jakarta.persistence.* import simplerag.ragback.domain.prompt.entity.enums.PreSet +import jakarta.persistence.* +import simplerag.ragback.domain.prompt.dto.PromptCreateRequest import simplerag.ragback.global.entity.BaseEntity @Entity @@ -19,8 +20,31 @@ class Prompt( @Lob val systemPrompt: String, -) : BaseEntity() { + ) : BaseEntity() { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "prompts_id") val id: Long = 0 + + companion object { + fun from( + promptCreateRequest: PromptCreateRequest + ): Prompt { + + 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" + ) } 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