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,50 +0,0 @@
package work.slhaf.partner.common.util;
import com.alibaba.fastjson2.JSONArray;
import work.slhaf.partner.api.agent.Agent;
import work.slhaf.partner.api.chat.pojo.Message;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
public class ResourcesUtil {
private static final ClassLoader classloader = Agent.class.getClassLoader();
public static class Prompt {
private static final String SELF_AWARENESS_PATH = "prompt/basic_prompt.json";
private static final String MODULE_PROMPT_PREFIX_PATH = "prompt/component/";
public static List<Message> loadPromptWithSelfAwareness(String modelKey, String promptType) {
//加载人格引导
List<Message> messages = new ArrayList<>(loadSelfAwareness());
//加载常规提示
String path = MODULE_PROMPT_PREFIX_PATH + promptType + "/" + modelKey + ".json";
messages.addAll(readPromptFromResources(path));
return messages;
}
public static List<Message> loadSelfAwareness() {
return readPromptFromResources(SELF_AWARENESS_PATH);
}
public static List<Message> loadPrompt(String modelKey, String promptType) {
return new ArrayList<>(readPromptFromResources(MODULE_PROMPT_PREFIX_PATH + promptType + "/" + modelKey + ".json"));
}
private static List<Message> readPromptFromResources(String filePath) {
try {
InputStream inputStream = classloader.getResourceAsStream(filePath);
String content = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
JSONArray array = JSONArray.parse(content);
inputStream.close();
return array.toJavaList(Message.class);
} catch (Exception e) {
throw new RuntimeException("读取Resource失败: " + filePath, e);
}
}
}
}

View File

@@ -4,7 +4,6 @@ import com.alibaba.fastjson2.JSONObject;
import lombok.val;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.module.modules.action.executor.entity.CorrectorInput;
import work.slhaf.partner.module.modules.action.executor.entity.CorrectorResult;
@@ -18,7 +17,7 @@ public class ActionCorrector extends AbstractAgentModule.Sub<CorrectorInput, Cor
@Override
public CorrectorResult execute(CorrectorInput input) {
val prompt = buildPrompt(input);
return formattedChat(List.of(new Message(ChatConstant.Character.USER, prompt)), CorrectorResult.class);
return formattedChat(List.of(new Message(Message.Character.USER, prompt)), CorrectorResult.class);
}
private String buildPrompt(CorrectorInput input) {

View File

@@ -9,7 +9,6 @@ import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentMod
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.agent.factory.component.annotation.Init;
import work.slhaf.partner.api.agent.factory.component.annotation.InjectModule;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.action.ActionCapability;
import work.slhaf.partner.core.action.ActionCore.ExecutorType;
@@ -63,7 +62,7 @@ public class ActionRepairer extends AbstractAgentModule.Sub<RepairerInput, Repai
try {
String prompt = assemblyHelper.buildPrompt(data, null);
RepairerData repairerData = formattedChat(
List.of(new Message(ChatConstant.Character.USER, prompt)),
List.of(new Message(Message.Character.USER, prompt)),
RepairerData.class
);
result = switch (repairerData.getRepairerType()) {
@@ -79,7 +78,7 @@ public class ActionRepairer extends AbstractAgentModule.Sub<RepairerInput, Repai
log.warn("常规行动修复失败,将尝试自对话通道");
prompt = assemblyHelper.buildPrompt(data, "常规行动修复失败,请尝试通过自对话通道获取必要的信息以完成行动参数的修复");
repairerData = formattedChat(
List.of(new Message(ChatConstant.Character.USER, prompt)),
List.of(new Message(Message.Character.USER, prompt)),
RepairerData.class
);
handleUserInteraction(repairerData.getData());

View File

@@ -6,7 +6,6 @@ import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapabili
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.agent.factory.component.annotation.Init;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.action.ActionCapability;
import work.slhaf.partner.core.action.entity.GeneratedData;
@@ -40,7 +39,7 @@ public class DynamicActionGenerator extends AbstractAgentModule.Sub<GeneratorInp
String prompt = buildPrompt(input);
// 响应结果需要包含几个特殊数据: 依赖项、代码内容、是否序列化、响应数据释义
GeneratedData generatorData = formattedChat(
List.of(new Message(ChatConstant.Character.USER, prompt)),
List.of(new Message(Message.Character.USER, prompt)),
GeneratedData.class
);
val location = runnerClient.buildTmpPath(input.getActionName(), generatorData.getCodeType());

View File

@@ -4,7 +4,6 @@ import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.action.entity.MetaActionInfo;
import work.slhaf.partner.module.modules.action.executor.entity.ExtractorInput;
@@ -23,7 +22,7 @@ public class ParamsExtractor extends AbstractAgentModule.Sub<ExtractorInput, Ext
String prompt = buildPrompt(input);
ExtractorResult result;
try {
result = formattedChat(List.of(new Message(ChatConstant.Character.USER, prompt)), ExtractorResult.class);
result = formattedChat(List.of(new Message(Message.Character.USER, prompt)), ExtractorResult.class);
} catch (Exception e) {
log.error("ParamsExtractor解析结果失败", e);
result = new ExtractorResult();

View File

@@ -4,7 +4,6 @@ import com.alibaba.fastjson2.JSONObject;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.action.ActionCapability;
import work.slhaf.partner.core.action.ActionCore.ExecutorType;
@@ -54,7 +53,7 @@ public class InterventionEvaluator extends AbstractAgentModule.Sub<EvaluatorInpu
try {
String prompt = buildPrompt(input.getRecentMessages(), input.getActivatedSlices(), actionData, tendency);
EvaluatedInterventionData evaluatedData = formattedChat(
List.of(new Message(ChatConstant.Character.USER, prompt)),
List.of(new Message(Message.Character.USER, prompt)),
EvaluatedInterventionData.class);
synchronized (evaluatedDataList) {
evaluatedDataList.add(evaluatedData);

View File

@@ -4,7 +4,6 @@ import com.alibaba.fastjson2.JSONObject;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.action.ActionCapability;
import work.slhaf.partner.core.action.ActionCore;
@@ -50,7 +49,7 @@ public class InterventionRecognizer extends AbstractAgentModule.Sub<RecognizerIn
try {
String prompt = buildPrompt(data, input);
MetaRecognizerResult result = formattedChat(
List.of(new Message(ChatConstant.Character.USER, prompt)),
List.of(new Message(Message.Character.USER, prompt)),
MetaRecognizerResult.class
);
if (result.isOk()) {

View File

@@ -5,7 +5,6 @@ import com.alibaba.fastjson2.JSONObject;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.action.ActionCapability;
import work.slhaf.partner.core.action.ActionCore;
@@ -39,7 +38,7 @@ public class ActionConfirmer extends AbstractAgentModule.Sub<ConfirmerInput, Con
ExecutableAction executableAction = pendingAction.getExecutableAction();
String prompt = buildPrompt(executableAction, data.getInput(), data.getRecentMessages());
DecisionResponse tempResult = formattedChat(
List.of(new Message(ChatConstant.Character.USER, prompt)),
List.of(new Message(Message.Character.USER, prompt)),
DecisionResponse.class
);
PendingActionRecord.Decision decision = parseDecision(tempResult);

View File

@@ -7,7 +7,6 @@ import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapabili
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.agent.factory.component.annotation.Init;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor;
import work.slhaf.partner.core.action.ActionCapability;
@@ -50,7 +49,7 @@ public class ActionEvaluator extends AbstractAgentModule.Sub<EvaluatorInput, Lis
for (EvaluatorBatchInput batchInput : batchInputs) {
list.add(() -> {
EvaluatorResult evaluatorResult = formattedChat(
List.of(new Message(ChatConstant.Character.USER, buildPrompt(batchInput))),
List.of(new Message(Message.Character.USER, buildPrompt(batchInput))),
EvaluatorResult.class
);
evaluatorResult.setTendency(batchInput.getTendency());

View File

@@ -4,7 +4,6 @@ import com.alibaba.fastjson2.JSONObject;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.action.ActionCapability;
import work.slhaf.partner.module.modules.action.planner.extractor.entity.ExtractorInput;
@@ -27,7 +26,7 @@ public class ActionExtractor extends AbstractAgentModule.Sub<ExtractorInput, Ext
for (int i = 0; i < 3; i++) {
try {
return formattedChat(
List.of(new Message(ChatConstant.Character.USER, JSONObject.toJSONString(data))),
List.of(new Message(Message.Character.USER, JSONObject.toJSONString(data))),
ExtractorResult.class
);
} catch (Exception e) {

View File

@@ -8,7 +8,6 @@ import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapabili
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.agent.factory.component.annotation.Init;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.api.chat.pojo.MetaMessage;
import work.slhaf.partner.core.cognation.CognationCapability;
@@ -143,7 +142,7 @@ public class CommunicationProducer extends AbstractAgentModule.Running<PartnerRu
private void updateModuleContextAndChatMessages(PartnerRunningFlowContext runningFlowContext, String response) {
cognationCapability.getMessageLock().lock();
chatMessages.removeIf(m -> {
if (m.getRole().equals(ChatConstant.Character.ASSISTANT)) {
if (m.getRole() == Message.Character.ASSISTANT) {
return false;
}
try {
@@ -156,9 +155,9 @@ public class CommunicationProducer extends AbstractAgentModule.Running<PartnerRu
//添加时间标志
// TODO 此处的时间标识应当采用 RunningFlowContext 携带时间
String dateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("\r\n**[yyyy-MM-dd HH:mm:ss]"));
Message primaryUserMessage = new Message(ChatConstant.Character.USER, runningFlowContext.getCoreContext().getText() + dateTime);
Message primaryUserMessage = new Message(Message.Character.USER, runningFlowContext.getCoreContext().getText() + dateTime);
chatMessages.add(primaryUserMessage);
Message assistantMessage = new Message(ChatConstant.Character.ASSISTANT, response);
Message assistantMessage = new Message(Message.Character.ASSISTANT, response);
chatMessages.add(assistantMessage);
cognationCapability.getMessageLock().unlock();
//区分单人聊天场景
@@ -169,7 +168,7 @@ public class CommunicationProducer extends AbstractAgentModule.Running<PartnerRu
}
private void setMessage(String coreContextStr) {
Message userMessage = new Message(ChatConstant.Character.USER, coreContextStr);
Message userMessage = new Message(Message.Character.USER, coreContextStr);
chatMessages.add(userMessage);
}
@@ -183,7 +182,7 @@ public class CommunicationProducer extends AbstractAgentModule.Running<PartnerRu
}
private void setAppendedPromptMessage(List<AppendPromptData> appendPrompt) {
Message appendDeclareMessage = new Message(ChatConstant.Character.USER, ModelConstant.CharacterPrefix.SYSTEM + "认知补充开始");
Message appendDeclareMessage = new Message(Message.Character.USER, ModelConstant.CharacterPrefix.SYSTEM + "认知补充开始");
this.appendedMessages.add(appendDeclareMessage);
for (AppendPromptData data : appendPrompt) {
setStartMessage(data);
@@ -191,29 +190,29 @@ public class CommunicationProducer extends AbstractAgentModule.Running<PartnerRu
setEndMessage(data);
setAssistantMessage();
}
Message appendEndMessage = new Message(ChatConstant.Character.USER, ModelConstant.CharacterPrefix.SYSTEM + "认知补充结束");
Message appendEndMessage = new Message(Message.Character.USER, ModelConstant.CharacterPrefix.SYSTEM + "认知补充结束");
this.appendedMessages.add(appendEndMessage);
}
private void setAssistantMessage() {
Message message = new Message(ChatConstant.Character.ASSISTANT, "嗯,明白了");
Message message = new Message(Message.Character.ASSISTANT, "嗯,明白了");
appendedMessages.add(message);
}
private void setEndMessage(AppendPromptData data) {
Message endMessage = new Message(ChatConstant.Character.USER, ModelConstant.CharacterPrefix.SYSTEM + data.getModuleName() + "认知补充结束.");
Message endMessage = new Message(Message.Character.USER, ModelConstant.CharacterPrefix.SYSTEM + data.getModuleName() + "认知补充结束.");
appendedMessages.add(endMessage);
}
private void setContentMessage(AppendPromptData data) {
data.getAppendedPrompt().forEach((k, v) -> {
Message contentMessage = new Message(ChatConstant.Character.USER, ModelConstant.CharacterPrefix.SYSTEM + k + v + "\r\n");
Message contentMessage = new Message(Message.Character.USER, ModelConstant.CharacterPrefix.SYSTEM + k + v + "\r\n");
appendedMessages.add(contentMessage);
});
}
private void setStartMessage(AppendPromptData data) {
Message startMessage = new Message(ChatConstant.Character.USER, ModelConstant.CharacterPrefix.SYSTEM + data.getModuleName() + "以下为" + data.getModuleName() + "相关认知.");
Message startMessage = new Message(Message.Character.USER, ModelConstant.CharacterPrefix.SYSTEM + data.getModuleName() + "以下为" + data.getModuleName() + "相关认知.");
appendedMessages.add(startMessage);
}

View File

@@ -5,7 +5,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.api.agent.factory.component.annotation.InjectModule;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.memory.MemoryCapability;
import work.slhaf.partner.core.memory.exception.UnExistedDateIndexException;
@@ -147,7 +147,7 @@ public class MemorySelector extends PreRunningAbstractAgentModuleAbstract {
private boolean isSingleUser() {
Set<String> userIdSet = new HashSet<>();
cognationCapability.getChatMessages().forEach(m -> {
if (m.getRole().equals(ChatConstant.Character.ASSISTANT)) {
if (m.getRole() == Message.Character.ASSISTANT) {
return;
}
String userId = extractUserId(m.getContent());

View File

@@ -8,7 +8,6 @@ import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.agent.factory.component.annotation.Init;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor;
import work.slhaf.partner.core.memory.pojo.EvaluatedSlice;
@@ -62,7 +61,7 @@ public class SliceSelectEvaluator extends AbstractAgentModule.Sub<EvaluatorInput
.build();
log.debug("[SliceSelectEvaluator] 评估[{}]输入: {}", thisCount, JSONObject.toJSONString(batchInput));
EvaluatorResult evaluatorResult = formattedChat(
List.of(new Message(ChatConstant.Character.USER, JSONUtil.toJsonStr(batchInput))),
List.of(new Message(Message.Character.USER, JSONUtil.toJsonStr(batchInput))),
EvaluatorResult.class
);
log.debug("[SliceSelectEvaluator] 评估[{}]结果: {}", thisCount, JSONObject.toJSONString(evaluatorResult));

View File

@@ -6,7 +6,6 @@ import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.api.chat.pojo.MetaMessage;
import work.slhaf.partner.core.cognation.CognationCapability;
@@ -53,7 +52,7 @@ public class MemorySelectExtractor extends AbstractAgentModule.Sub<PartnerRunnin
.build();
log.debug("[MemorySelectExtractor] 主题提取输入: {}", JSONUtil.toJsonStr(extractorInput));
extractorResult = formattedChat(
List.of(new Message(ChatConstant.Character.USER, JSONUtil.toJsonPrettyStr(extractorInput))),
List.of(new Message(Message.Character.USER, JSONUtil.toJsonPrettyStr(extractorInput))),
ExtractorResult.class
);
log.debug("[MemorySelectExtractor] 主题提取结果: {}", extractorResult);

View File

@@ -7,7 +7,6 @@ import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.api.agent.factory.component.annotation.Init;
import work.slhaf.partner.api.agent.factory.component.annotation.InjectModule;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.api.chat.pojo.MetaMessage;
import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor;
@@ -215,7 +214,7 @@ public class MemoryUpdater extends PostRunningAgentModule {
private List<Message> getCleanedMessages(List<Message> chatMessages) {
return chatMessages.stream()
.map(message -> {
if (message.getRole().equals(ChatConstant.Character.ASSISTANT)) {
if (message.getRole() == Message.Character.ASSISTANT) {
return message;
}
List<String> splitResult = Arrays.stream(message.getContent().split("\\*\\*")).toList();
@@ -223,13 +222,13 @@ public class MemoryUpdater extends PostRunningAgentModule {
return message;
}
String time = splitResult.getLast();
return new Message(ChatConstant.Character.USER, message.getContent().replace("\r\n**" + time, ""));
return new Message(Message.Character.USER, message.getContent().replace("\r\n**" + time, ""));
}).toList();
}
private void setInvolvedUserId(String startUserId, MemorySlice memorySlice, List<Message> chatMessages) {
for (Message chatMessage : chatMessages) {
if (chatMessage.getRole().equals(ChatConstant.Character.ASSISTANT)) {
if (chatMessage.getRole() == Message.Character.ASSISTANT) {
continue;
}
// 匹配userId

View File

@@ -6,7 +6,6 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.module.modules.memory.updater.summarizer.entity.SummarizeInput;
import work.slhaf.partner.module.modules.memory.updater.summarizer.entity.SummarizeResult;
@@ -23,7 +22,7 @@ public class MultiSummarizer extends AbstractAgentModule.Sub<SummarizeInput, Sum
public SummarizeResult execute(SummarizeInput input) {
log.debug("[MemorySummarizer] 整体摘要开始...");
SummarizeResult result = formattedChat(
List.of(new Message(ChatConstant.Character.USER, JSONUtil.toJsonPrettyStr(input))),
List.of(new Message(Message.Character.USER, JSONUtil.toJsonPrettyStr(input))),
SummarizeResult.class
);
log.debug("[MemorySummarizer] 整体摘要结果: {}", JSONObject.toJSONString(result));

View File

@@ -6,7 +6,6 @@ import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.agent.factory.component.annotation.Init;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor;
@@ -33,7 +32,7 @@ public class SingleSummarizer extends AbstractAgentModule.Sub<List<Message>, Voi
AtomicInteger counter = new AtomicInteger();
for (int i = 0; i < chatMessages.size(); i++) {
Message chatMessage = chatMessages.get(i);
if (chatMessage.getRole().equals(ChatConstant.Character.ASSISTANT)) {
if (chatMessage.getRole() == Message.Character.ASSISTANT) {
String content = chatMessage.getContent();
if (chatMessage.getContent().length() > 500) {
int index = i;
@@ -41,7 +40,7 @@ public class SingleSummarizer extends AbstractAgentModule.Sub<List<Message>, Voi
int thisCount = counter.incrementAndGet();
log.debug("[MemorySummarizer] 长文本摘要[{}]启动", thisCount);
String summarized = singleExecute(JSONObject.of("content", content).toString());
chatMessages.set(index, new Message(chatMessage.getRole(), summarized));
chatMessages.set(index, new Message(Message.Character.ASSISTANT, summarized));
log.debug("[MemorySummarizer] 长文本摘要[{}]完成", thisCount);
return null;
});
@@ -55,7 +54,7 @@ public class SingleSummarizer extends AbstractAgentModule.Sub<List<Message>, Voi
private String singleExecute(String primaryContent) {
try {
return chat(List.of(new Message(ChatConstant.Character.USER, primaryContent)));
return chat(List.of(new Message(Message.Character.USER, primaryContent)));
} catch (Exception e) {
log.error("[SingleSummarizer] 单消息总结出错: ", e);
return primaryContent;

View File

@@ -5,7 +5,6 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import java.util.HashMap;
@@ -16,7 +15,7 @@ import java.util.List;
public class TotalSummarizer extends AbstractAgentModule.Sub<HashMap<String, String>, String> implements ActivateModel {
public String execute(HashMap<String, String> singleMemorySummary) {
return formattedChat(
List.of(new Message(ChatConstant.Character.USER, JSONUtil.toJsonPrettyStr(singleMemorySummary))),
List.of(new Message(Message.Character.USER, JSONUtil.toJsonPrettyStr(singleMemorySummary))),
SummaryContent.class
).getContent();
}

View File

@@ -6,7 +6,6 @@ import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.perceive.PerceiveCapability;
@@ -50,7 +49,7 @@ public class RelationExtractor extends AbstractAgentModule.Sub<PartnerRunningFlo
private RelationExtractResult getRelationResult(RelationExtractInput input) {
return formattedChat(
List.of(new Message(ChatConstant.Character.USER, JSONObject.toJSONString(input))),
List.of(new Message(Message.Character.USER, JSONObject.toJSONString(input))),
RelationExtractResult.class
);
}

View File

@@ -7,7 +7,6 @@ import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.perceive.PerceiveCapability;
@@ -32,7 +31,7 @@ public class StaticMemoryExtractor extends AbstractAgentModule.Sub<PartnerRunnin
.messages(cognationCapability.getChatMessages())
.existedStaticMap(perceiveCapability.getUser(context.getSource()).getStaticMemory())
.build();
String response = chat(List.of(new Message(ChatConstant.Character.USER, JSONUtil.toJsonPrettyStr(input))));
String response = chat(List.of(new Message(Message.Character.USER, JSONUtil.toJsonPrettyStr(input))));
JSONObject jsonObject = JSONObject.parseObject(response);
HashMap<String, String> result = new HashMap<>();
jsonObject.forEach((k, v) -> result.put(k, (String) v));

View File

@@ -1,100 +0,0 @@
package experimental;
import cn.hutool.json.JSONUtil;
import org.junit.jupiter.api.Test;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.api.chat.runtime.OpenAiChatRuntime;
import work.slhaf.partner.common.util.ResourcesUtil;
import work.slhaf.partner.module.common.model.ModelConstant;
import work.slhaf.partner.module.modules.memory.selector.extractor.entity.ExtractorInput;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class SelfAwarenessTest {
private static OpenAiChatRuntime getChatRuntime(String modelKey) {
String model = "";
String baseUrl = "";
String apikey = "";
return new OpenAiChatRuntime(baseUrl, apikey, model);
}
@Test
public void awarenessTest() {
String modelKey = "core_model";
OpenAiChatRuntime client = getChatRuntime(modelKey);
String response = client.chat(ResourcesUtil.Prompt.loadPromptWithSelfAwareness(modelKey, ModelConstant.Prompt.CORE), false);
System.out.println(response);
System.out.println("\r\n----------\r\n");
}
@Test
public void getModuleResponseTest() {
String modelKey = "relation_extractor";
OpenAiChatRuntime client = getChatRuntime(modelKey);
List<Message> chatMessages = new ArrayList<>(ResourcesUtil.Prompt.loadPromptWithSelfAwareness(modelKey, ModelConstant.Prompt.PERCEIVE));
// chatMessages.add(Message.builder()
// .role(ChatConstant.Character.USER)
// .content("[RA9] 那么,接下来,你是否愿意当作这样一个名为'Partner'的智能体的记忆更新模块?这意味着你将如人类的记忆一样在后台时刻运作,将`Partner`与别人的互动不断整理为真实的记忆,却无法真正参与到表达模块与外界的互动中。你只需要回答是否愿意,若愿意,接下来‘我’将不再与你对话,届时你接收到的信息将会是'Partner'的数据流转输入。")
// .build());
String chatResponse = client.chat(chatMessages, false);
System.out.println(chatResponse);
System.out.println("\n\n----------\n\n");
}
@Test
public void interactionTest() {
String modelKey = "core_model";
String user = "[SLHAF] ";
OpenAiChatRuntime client = getChatRuntime(modelKey);
List<Message> messages = new ArrayList<>(ResourcesUtil.Prompt.loadPromptWithSelfAwareness(modelKey, ModelConstant.Prompt.CORE));
Scanner scanner = new Scanner(System.in);
String input;
while (true) {
System.out.print("[INPUT]: ");
if ((input = scanner.nextLine()).equals("exit")) {
break;
}
System.out.println("\r\n----------\r\n");
messages.add(new Message(ChatConstant.Character.USER, user + input));
String response = client.chat(messages, false);
System.out.println("[OUTPUT]: " + response);
System.out.println("\r\n----------\r\n");
messages.add(new Message(ChatConstant.Character.ASSISTANT, response));
}
}
@Test
public void topicExtractorText() {
String topic_tree = """
编程[root]
├── JavaScript[0]
│ ├── NodeJS[0]
│ │ ├── 并发处理[1]
│ │ └── 事件循环[1]
│ └── Express[1]
│ └── 中间件[0]
└── Python"
""";
String modelKey = "topic_extractor";
OpenAiChatRuntime client = getChatRuntime(modelKey);
// List<Message> messages = new ArrayList<>(ResourcesUtil.Prompt.loadPromptWithSelfAwareness(modelKey, ModelConstant.Prompt.MEMORY));
List<Message> messages = new ArrayList<>(ResourcesUtil.Prompt.loadPrompt(modelKey, ModelConstant.Prompt.MEMORY));
ExtractorInput input = ExtractorInput.builder()
.text("[slhaf] 2024-04-15讨论的Python内容和现在的Express需求")
.topic_tree(topic_tree)
.date(LocalDate.now())
.history(new ArrayList<>())
.activatedMemorySlices(new ArrayList<>())
.build();
messages.add(new Message(ChatConstant.Character.USER, JSONUtil.toJsonPrettyStr(input)));
String response = client.chat(messages, false);
System.out.println(response);
System.out.println("\r\n----------\r\n");
}
}

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"));
}
}