data class ChatBotReq(
val content: String,
@JsonProperty("assistant_id")
val assistantId: String
)
data class ChatGPTReq(
@JsonProperty("assistant_id")
val assistantId: String,
val thread: Thread,
val stream: Boolean
)
data class Message(
val role: String,
val content: String
)
data class Thread(
val messages: List<Message>
)
여기서 ChatBotReq는 외부서버에서 해당 서버로 요청 할 때 사용하는 DTO이고, 그 아래의 3개는 openAi로 요청 할 때 사용하는 DTO이다.
Response DTO
data class ChatGPTRes(
val id: String,
@JsonProperty("object")
val objectType: String,
@JsonProperty("created_at")
val createdAt: Long,
@JsonProperty("assistant_id")
val assistantId: String,
@JsonProperty("thread_id")
val threadId: String,
@JsonProperty("run_id")
val runId: String,
val status: String,
@JsonProperty("incomplete_details")
val incompleteDetails: String?,
@JsonProperty("incomplete_at")
val incompleteAt: Long?,
@JsonProperty("completed_at")
val completedAt: Long,
val role: String,
val content: List<Content>,
val attachments: List<Any>,
val metadata: Map<String, Any>?
)
data class Content(
val type: String,
val text: Text
)
data class Text(
val value: String,
val annotations: List<Annotation>?
)
data class Annotation(
val type: String,
val text: String,
@JsonProperty("start_index")
val startIndex: Int,
@JsonProperty("end_index")
val endIndex: Int,
@JsonProperty("file_citation")
val fileCitation: FileCitation?
)
data class FileCitation(
@JsonProperty("file_id")
val fileId: String?
)
OpenAI로부터 오는 응답 DTO이다.
근데 사실 여기서는 문자열로 받아서, 그 문자열을 ObjectMapper를 사용하여 해당 클래스로 매핑할 예정이다.
그 다음은 Router이다.
@Configuration
class ChatBotRouter {
@Bean
fun chatBotRouterMapping(
chatBotHandler: ChatBotHandler
) = coRouter {
POST("/", chatBotHandler::post)
}
}