refactor(chat): use Message.Character enum for roles and remove unused prompt helpers

This commit is contained in:
2026-03-09 22:12:35 +08:00
parent 1b2ccaee9c
commit 5db533f823
25 changed files with 103 additions and 222 deletions

View File

@@ -1,14 +0,0 @@
package work.slhaf.partner.api.chat.constant;
public class ChatConstant {
public enum ResponseStatus {
SUCCESS, FAILED
}
public static class Character {
public static final String USER = "user";
public static final String SYSTEM = "system";
public static final String ASSISTANT = "assistant";
}
}

View File

@@ -1,12 +1,39 @@
package work.slhaf.partner.api.chat.pojo
import com.alibaba.fastjson2.annotation.JSONCreator
import com.alibaba.fastjson2.annotation.JSONField
import com.fasterxml.jackson.annotation.JsonCreator
import com.fasterxml.jackson.annotation.JsonValue
import work.slhaf.partner.api.common.entity.PersistableObject
import java.io.Serial
data class Message(
val role: String,
val role: Character,
val content: String
) : PersistableObject() {
fun roleValue(): String = role.value
enum class Character(
@get:JsonValue
@get:JSONField(value = true)
val value: String
) {
USER("user"),
SYSTEM("system"),
ASSISTANT("assistant");
companion object {
@JvmStatic
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
@JSONCreator
fun fromValue(value: String): Character {
return entries.firstOrNull { it.value == value }
?: throw IllegalArgumentException("Unsupported message role: $value")
}
}
}
companion object {
@Serial
private const val serialVersionUID = 1L

View File

@@ -4,7 +4,6 @@ import com.openai.models.chat.completions.ChatCompletionAssistantMessageParam;
import com.openai.models.chat.completions.ChatCompletionMessageParam;
import com.openai.models.chat.completions.ChatCompletionSystemMessageParam;
import com.openai.models.chat.completions.ChatCompletionUserMessageParam;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import java.util.ArrayList;
@@ -25,16 +24,15 @@ public final class OpenAiMessageAdapter {
public static ChatCompletionMessageParam toParam(Message message) {
return switch (message.getRole()) {
case ChatConstant.Character.SYSTEM -> ChatCompletionMessageParam.ofSystem(
case SYSTEM -> ChatCompletionMessageParam.ofSystem(
ChatCompletionSystemMessageParam.builder().content(message.getContent()).build()
);
case ChatConstant.Character.ASSISTANT -> ChatCompletionMessageParam.ofAssistant(
case ASSISTANT -> ChatCompletionMessageParam.ofAssistant(
ChatCompletionAssistantMessageParam.builder().content(message.getContent()).build()
);
case ChatConstant.Character.USER -> ChatCompletionMessageParam.ofUser(
case USER -> ChatCompletionMessageParam.ofUser(
ChatCompletionUserMessageParam.builder().content(message.getContent()).build()
);
default -> throw new IllegalArgumentException("Unsupported message role: " + message.getRole());
};
}
}

View File

@@ -0,0 +1,38 @@
package work.slhaf.partner.api.chat.pojo;
import com.alibaba.fastjson2.JSON;
import org.junit.jupiter.api.Test;
import work.slhaf.partner.api.chat.runtime.OpenAiMessageAdapter;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
class MessageTest {
@Test
void shouldSerializeRoleAsProtocolValue() {
String json = JSON.toJSONString(new Message(Message.Character.USER, "hello"));
assertEquals("{\"content\":\"hello\",\"role\":\"user\"}", json);
}
@Test
void shouldDeserializeRoleFromProtocolValue() {
Message message = JSON.parseObject("{\"role\":\"assistant\",\"content\":\"ok\"}", Message.class);
assertEquals(Message.Character.ASSISTANT, message.getRole());
assertEquals("assistant", message.roleValue());
}
@Test
void shouldRejectUnsupportedRole() {
assertThrows(IllegalArgumentException.class, () -> Message.Character.fromValue("tool"));
}
@Test
void shouldAdaptAllSupportedRoles() {
OpenAiMessageAdapter.toParam(new Message(Message.Character.USER, "u"));
OpenAiMessageAdapter.toParam(new Message(Message.Character.SYSTEM, "s"));
OpenAiMessageAdapter.toParam(new Message(Message.Character.ASSISTANT, "a"));
}
}