@elizaos/plugin-memory 1.0.6 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.browser.js +19 -32
- package/dist/browser/index.browser.js.map +8 -7
- package/dist/cjs/index.node.cjs +260 -508
- package/dist/cjs/index.node.js.map +8 -7
- package/dist/index.d.ts +3 -0
- package/dist/node/index.node.js +271 -516
- package/dist/node/index.node.js.map +8 -7
- package/dist/providers/context-summary.d.ts +12 -0
- package/dist/providers/recent-messages.d.ts +15 -0
- package/package.json +1 -1
- package/dist/providers/short-term-memory.d.ts +0 -21
package/dist/node/index.node.js
CHANGED
|
@@ -174,7 +174,7 @@ class MemoryService extends Service {
|
|
|
174
174
|
if (extractionInterval) {
|
|
175
175
|
this.memoryConfig.longTermExtractionInterval = parseInt(extractionInterval, 10);
|
|
176
176
|
}
|
|
177
|
-
logger.
|
|
177
|
+
logger.debug({
|
|
178
178
|
summarizationThreshold: this.memoryConfig.shortTermSummarizationThreshold,
|
|
179
179
|
summarizationInterval: this.memoryConfig.shortTermSummarizationInterval,
|
|
180
180
|
maxNewMessages: this.memoryConfig.summaryMaxNewMessages,
|
|
@@ -535,6 +535,16 @@ import {
|
|
|
535
535
|
ModelType,
|
|
536
536
|
composePromptFromState
|
|
537
537
|
} from "@elizaos/core";
|
|
538
|
+
async function getDialogueMessageCount(runtime, roomId) {
|
|
539
|
+
const messages = await runtime.getMemories({
|
|
540
|
+
tableName: "messages",
|
|
541
|
+
roomId,
|
|
542
|
+
count: 100,
|
|
543
|
+
unique: false
|
|
544
|
+
});
|
|
545
|
+
const dialogueMessages = messages.filter((msg) => !(msg.content?.type === "action_result" && msg.metadata?.type === "action_result") && (msg.metadata?.type === "agent_response_message" || msg.metadata?.type === "user_message"));
|
|
546
|
+
return dialogueMessages.length;
|
|
547
|
+
}
|
|
538
548
|
var initialSummarizationTemplate = `# Task: Summarize Conversation
|
|
539
549
|
|
|
540
550
|
You are analyzing a conversation to create a concise summary that captures the key points, topics, and important details.
|
|
@@ -622,26 +632,26 @@ var summarizationEvaluator = {
|
|
|
622
632
|
return false;
|
|
623
633
|
}
|
|
624
634
|
const config = memoryService.getConfig();
|
|
625
|
-
const
|
|
635
|
+
const currentDialogueCount = await getDialogueMessageCount(runtime, message.roomId);
|
|
626
636
|
const existingSummary = await memoryService.getCurrentSessionSummary(message.roomId);
|
|
627
637
|
if (!existingSummary) {
|
|
628
|
-
const shouldSummarize =
|
|
638
|
+
const shouldSummarize = currentDialogueCount >= config.shortTermSummarizationThreshold;
|
|
629
639
|
logger2.debug({
|
|
630
640
|
roomId: message.roomId,
|
|
631
|
-
|
|
641
|
+
currentDialogueCount,
|
|
632
642
|
threshold: config.shortTermSummarizationThreshold,
|
|
633
643
|
shouldSummarize,
|
|
634
644
|
reason: "initial_summary_check"
|
|
635
645
|
}, "Summarization validation check");
|
|
636
646
|
return shouldSummarize;
|
|
637
647
|
} else {
|
|
638
|
-
const
|
|
639
|
-
const shouldUpdate =
|
|
648
|
+
const newDialogueCount = currentDialogueCount - existingSummary.lastMessageOffset;
|
|
649
|
+
const shouldUpdate = newDialogueCount >= config.shortTermSummarizationInterval;
|
|
640
650
|
logger2.debug({
|
|
641
651
|
roomId: message.roomId,
|
|
642
|
-
|
|
652
|
+
currentDialogueCount,
|
|
643
653
|
lastOffset: existingSummary.lastMessageOffset,
|
|
644
|
-
|
|
654
|
+
newDialogueCount,
|
|
645
655
|
interval: config.shortTermSummarizationInterval,
|
|
646
656
|
shouldUpdate,
|
|
647
657
|
reason: "summary_update_check"
|
|
@@ -661,30 +671,31 @@ var summarizationEvaluator = {
|
|
|
661
671
|
logger2.info(`Starting summarization for room ${roomId}`);
|
|
662
672
|
const existingSummary = await memoryService.getCurrentSessionSummary(roomId);
|
|
663
673
|
const lastOffset = existingSummary?.lastMessageOffset || 0;
|
|
664
|
-
const
|
|
665
|
-
const newMessageCount = totalMessageCount - lastOffset;
|
|
666
|
-
const maxNewMessages = config.summaryMaxNewMessages || 50;
|
|
667
|
-
const messagesToFetch = Math.min(newMessageCount, maxNewMessages);
|
|
668
|
-
if (messagesToFetch === 0) {
|
|
669
|
-
logger2.debug("No new messages to summarize");
|
|
670
|
-
return;
|
|
671
|
-
}
|
|
672
|
-
if (newMessageCount > maxNewMessages) {
|
|
673
|
-
logger2.warn(`Capping new messages at ${maxNewMessages} (${newMessageCount} available). Oldest messages will be skipped.`);
|
|
674
|
-
}
|
|
675
|
-
const newMessages = await runtime.getMemories({
|
|
674
|
+
const allMessages = await runtime.getMemories({
|
|
676
675
|
tableName: "messages",
|
|
677
676
|
roomId,
|
|
678
|
-
count:
|
|
679
|
-
unique: false
|
|
680
|
-
start: lastOffset
|
|
677
|
+
count: 1000,
|
|
678
|
+
unique: false
|
|
681
679
|
});
|
|
682
|
-
|
|
683
|
-
|
|
680
|
+
const allDialogueMessages = allMessages.filter((msg) => !(msg.content?.type === "action_result" && msg.metadata?.type === "action_result") && (msg.metadata?.type === "agent_response_message" || msg.metadata?.type === "user_message"));
|
|
681
|
+
const totalDialogueCount = allDialogueMessages.length;
|
|
682
|
+
const newDialogueCount = totalDialogueCount - lastOffset;
|
|
683
|
+
if (newDialogueCount === 0) {
|
|
684
|
+
logger2.debug("No new dialogue messages to summarize");
|
|
685
|
+
return;
|
|
686
|
+
}
|
|
687
|
+
const maxNewMessages = config.summaryMaxNewMessages || 50;
|
|
688
|
+
const messagesToProcess = Math.min(newDialogueCount, maxNewMessages);
|
|
689
|
+
if (newDialogueCount > maxNewMessages) {
|
|
690
|
+
logger2.warn(`Capping new dialogue messages at ${maxNewMessages} (${newDialogueCount} available). Oldest messages will be skipped.`);
|
|
691
|
+
}
|
|
692
|
+
const sortedDialogueMessages = allDialogueMessages.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0));
|
|
693
|
+
const newDialogueMessages = sortedDialogueMessages.slice(lastOffset, lastOffset + messagesToProcess);
|
|
694
|
+
if (newDialogueMessages.length === 0) {
|
|
695
|
+
logger2.debug("No new dialogue messages retrieved after filtering");
|
|
684
696
|
return;
|
|
685
697
|
}
|
|
686
|
-
const
|
|
687
|
-
const formattedMessages = sortedMessages.map((msg) => {
|
|
698
|
+
const formattedMessages = newDialogueMessages.map((msg) => {
|
|
688
699
|
const sender = msg.entityId === runtime.agentId ? runtime.character.name : "User";
|
|
689
700
|
return `${sender}: ${msg.content.text || "[non-text message]"}`;
|
|
690
701
|
}).join(`
|
|
@@ -704,11 +715,16 @@ var summarizationEvaluator = {
|
|
|
704
715
|
template
|
|
705
716
|
});
|
|
706
717
|
} else {
|
|
718
|
+
const initialMessages = sortedDialogueMessages.map((msg) => {
|
|
719
|
+
const sender = msg.entityId === runtime.agentId ? runtime.character.name : "User";
|
|
720
|
+
return `${sender}: ${msg.content.text || "[non-text message]"}`;
|
|
721
|
+
}).join(`
|
|
722
|
+
`);
|
|
707
723
|
template = initialSummarizationTemplate;
|
|
708
724
|
prompt = composePromptFromState({
|
|
709
725
|
state: {
|
|
710
726
|
...state,
|
|
711
|
-
recentMessages:
|
|
727
|
+
recentMessages: initialMessages
|
|
712
728
|
},
|
|
713
729
|
template
|
|
714
730
|
});
|
|
@@ -719,15 +735,15 @@ var summarizationEvaluator = {
|
|
|
719
735
|
});
|
|
720
736
|
const summaryResult = parseSummaryXML(response);
|
|
721
737
|
logger2.info(`${existingSummary ? "Updated" : "Generated"} summary: ${summaryResult.summary.substring(0, 100)}...`);
|
|
722
|
-
const newOffset =
|
|
723
|
-
const firstMessage =
|
|
724
|
-
const lastMessage =
|
|
738
|
+
const newOffset = lastOffset + newDialogueMessages.length;
|
|
739
|
+
const firstMessage = newDialogueMessages[0];
|
|
740
|
+
const lastMessage = newDialogueMessages[newDialogueMessages.length - 1];
|
|
725
741
|
const startTime = existingSummary ? existingSummary.startTime : firstMessage?.createdAt && firstMessage.createdAt > 0 ? new Date(firstMessage.createdAt) : new Date;
|
|
726
742
|
const endTime = lastMessage?.createdAt && lastMessage.createdAt > 0 ? new Date(lastMessage.createdAt) : new Date;
|
|
727
743
|
if (existingSummary) {
|
|
728
744
|
await memoryService.updateSessionSummary(existingSummary.id, roomId, {
|
|
729
745
|
summary: summaryResult.summary,
|
|
730
|
-
messageCount: existingSummary.messageCount +
|
|
746
|
+
messageCount: existingSummary.messageCount + newDialogueMessages.length,
|
|
731
747
|
lastMessageOffset: newOffset,
|
|
732
748
|
endTime,
|
|
733
749
|
topics: summaryResult.topics,
|
|
@@ -735,15 +751,15 @@ var summarizationEvaluator = {
|
|
|
735
751
|
keyPoints: summaryResult.keyPoints
|
|
736
752
|
}
|
|
737
753
|
});
|
|
738
|
-
logger2.info(`Updated summary for room ${roomId}: ${
|
|
754
|
+
logger2.info(`Updated summary for room ${roomId}: ${newDialogueMessages.length} new dialogue messages processed (offset: ${lastOffset} → ${newOffset})`);
|
|
739
755
|
} else {
|
|
740
756
|
await memoryService.storeSessionSummary({
|
|
741
757
|
agentId: runtime.agentId,
|
|
742
758
|
roomId,
|
|
743
759
|
entityId: message.entityId !== runtime.agentId ? message.entityId : undefined,
|
|
744
760
|
summary: summaryResult.summary,
|
|
745
|
-
messageCount:
|
|
746
|
-
lastMessageOffset:
|
|
761
|
+
messageCount: totalDialogueCount,
|
|
762
|
+
lastMessageOffset: totalDialogueCount,
|
|
747
763
|
startTime,
|
|
748
764
|
endTime,
|
|
749
765
|
topics: summaryResult.topics,
|
|
@@ -751,7 +767,7 @@ var summarizationEvaluator = {
|
|
|
751
767
|
keyPoints: summaryResult.keyPoints
|
|
752
768
|
}
|
|
753
769
|
});
|
|
754
|
-
logger2.info(`Created new summary for room ${roomId}: ${
|
|
770
|
+
logger2.info(`Created new summary for room ${roomId}: ${totalDialogueCount} dialogue messages summarized (offset: 0 → ${totalDialogueCount})`);
|
|
755
771
|
}
|
|
756
772
|
} catch (error) {
|
|
757
773
|
logger2.error({ error }, "Error during summarization:");
|
|
@@ -1023,484 +1039,10 @@ var longTermExtractionEvaluator = {
|
|
|
1023
1039
|
examples: []
|
|
1024
1040
|
};
|
|
1025
1041
|
|
|
1026
|
-
// src/providers/short-term-memory.ts
|
|
1027
|
-
import {
|
|
1028
|
-
addHeader,
|
|
1029
|
-
ChannelType,
|
|
1030
|
-
formatMessages,
|
|
1031
|
-
formatPosts,
|
|
1032
|
-
getEntityDetails,
|
|
1033
|
-
logger as logger4
|
|
1034
|
-
} from "@elizaos/core";
|
|
1035
|
-
var getRecentInteractions = async (runtime, sourceEntityId, targetEntityId, excludeRoomId) => {
|
|
1036
|
-
const rooms = await runtime.getRoomsForParticipants([sourceEntityId, targetEntityId]);
|
|
1037
|
-
return runtime.getMemoriesByRoomIds({
|
|
1038
|
-
tableName: "messages",
|
|
1039
|
-
roomIds: rooms.filter((room) => room !== excludeRoomId),
|
|
1040
|
-
limit: 20
|
|
1041
|
-
});
|
|
1042
|
-
};
|
|
1043
|
-
var shortTermMemoryProvider = {
|
|
1044
|
-
name: "SHORT_TERM_MEMORY",
|
|
1045
|
-
description: "Unified conversation context with smart summarization and interactions",
|
|
1046
|
-
position: 95,
|
|
1047
|
-
get: async (runtime, message, _state) => {
|
|
1048
|
-
try {
|
|
1049
|
-
const memoryService = runtime.getService("memory");
|
|
1050
|
-
const { roomId } = message;
|
|
1051
|
-
const conversationLength = 16;
|
|
1052
|
-
const config = memoryService?.getConfig() || {
|
|
1053
|
-
shortTermSummarizationThreshold: 16,
|
|
1054
|
-
shortTermRetainRecent: 6
|
|
1055
|
-
};
|
|
1056
|
-
const totalMessageCount = await runtime.countMemories(roomId, false, "messages");
|
|
1057
|
-
const useSummarization = memoryService && totalMessageCount >= config.shortTermSummarizationThreshold;
|
|
1058
|
-
if (!useSummarization) {
|
|
1059
|
-
const [entitiesData, room, recentMessagesData, recentInteractionsData] = await Promise.all([
|
|
1060
|
-
getEntityDetails({ runtime, roomId }),
|
|
1061
|
-
runtime.getRoom(roomId),
|
|
1062
|
-
runtime.getMemories({
|
|
1063
|
-
tableName: "messages",
|
|
1064
|
-
roomId,
|
|
1065
|
-
count: conversationLength,
|
|
1066
|
-
unique: false
|
|
1067
|
-
}),
|
|
1068
|
-
message.entityId !== runtime.agentId ? getRecentInteractions(runtime, message.entityId, runtime.agentId, roomId) : Promise.resolve([])
|
|
1069
|
-
]);
|
|
1070
|
-
const actionResultMessages = recentMessagesData.filter((msg) => msg.content?.type === "action_result" && msg.metadata?.type === "action_result");
|
|
1071
|
-
const dialogueMessages = recentMessagesData.filter((msg) => !(msg.content?.type === "action_result" && msg.metadata?.type === "action_result"));
|
|
1072
|
-
const isPostFormat = room?.type ? room.type === ChannelType.FEED || room.type === ChannelType.THREAD : false;
|
|
1073
|
-
const [formattedRecentMessages, formattedRecentPosts] = await Promise.all([
|
|
1074
|
-
formatMessages({
|
|
1075
|
-
messages: dialogueMessages,
|
|
1076
|
-
entities: entitiesData
|
|
1077
|
-
}),
|
|
1078
|
-
formatPosts({
|
|
1079
|
-
messages: dialogueMessages,
|
|
1080
|
-
entities: entitiesData,
|
|
1081
|
-
conversationHeader: false
|
|
1082
|
-
})
|
|
1083
|
-
]);
|
|
1084
|
-
const formatConversationLog = (messages, includeThoughts) => {
|
|
1085
|
-
return messages.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0)).map((msg) => {
|
|
1086
|
-
const entity = entitiesData.find((e) => e.id === msg.entityId);
|
|
1087
|
-
const entityName = entity?.names[0] || (msg.entityId === runtime.agentId ? runtime.character.name : "Unknown");
|
|
1088
|
-
const timestamp4 = msg.createdAt ? new Date(msg.createdAt).toLocaleString() : "Unknown time";
|
|
1089
|
-
const text5 = msg.content.text || "";
|
|
1090
|
-
const thought = includeThoughts && msg.content.internalMonologue ? `
|
|
1091
|
-
[Internal thought: ${msg.content.internalMonologue}]` : "";
|
|
1092
|
-
return `[${timestamp4}] ${entityName}: ${text5}${thought}`;
|
|
1093
|
-
}).join(`
|
|
1094
|
-
`);
|
|
1095
|
-
};
|
|
1096
|
-
const conversationLog = formatConversationLog(dialogueMessages, false);
|
|
1097
|
-
const conversationLogWithAgentThoughts = formatConversationLog(dialogueMessages, true);
|
|
1098
|
-
let actionResultsText = "";
|
|
1099
|
-
if (actionResultMessages.length > 0) {
|
|
1100
|
-
const groupedByRun = new Map;
|
|
1101
|
-
for (const mem of actionResultMessages) {
|
|
1102
|
-
const runId = String(mem.content?.runId || "unknown");
|
|
1103
|
-
if (!groupedByRun.has(runId)) {
|
|
1104
|
-
groupedByRun.set(runId, []);
|
|
1105
|
-
}
|
|
1106
|
-
const memories = groupedByRun.get(runId);
|
|
1107
|
-
if (memories) {
|
|
1108
|
-
memories.push(mem);
|
|
1109
|
-
}
|
|
1110
|
-
}
|
|
1111
|
-
const formattedActionResults = Array.from(groupedByRun.entries()).slice(-3).map(([runId, memories]) => {
|
|
1112
|
-
const sortedMemories = memories.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0));
|
|
1113
|
-
const thought = sortedMemories[0]?.content?.planThought || "";
|
|
1114
|
-
const runText = sortedMemories.map((mem) => {
|
|
1115
|
-
const actionName = mem.content?.actionName || "Unknown";
|
|
1116
|
-
const status = mem.content?.actionStatus || "unknown";
|
|
1117
|
-
const planStep = mem.content?.planStep || "";
|
|
1118
|
-
const text5 = mem.content?.text || "";
|
|
1119
|
-
const error = mem.content?.error || "";
|
|
1120
|
-
let memText = ` - ${actionName} (${status})`;
|
|
1121
|
-
if (planStep)
|
|
1122
|
-
memText += ` [${planStep}]`;
|
|
1123
|
-
if (error) {
|
|
1124
|
-
memText += `: Error - ${error}`;
|
|
1125
|
-
} else if (text5 && text5 !== `Executed action: ${actionName}`) {
|
|
1126
|
-
memText += `: ${text5}`;
|
|
1127
|
-
}
|
|
1128
|
-
return memText;
|
|
1129
|
-
}).join(`
|
|
1130
|
-
`);
|
|
1131
|
-
return `**Action Run ${runId.slice(0, 8)}**${thought ? ` - "${thought}"` : ""}
|
|
1132
|
-
${runText}`;
|
|
1133
|
-
}).join(`
|
|
1134
|
-
|
|
1135
|
-
`);
|
|
1136
|
-
actionResultsText = formattedActionResults ? addHeader("# Recent Action Executions", formattedActionResults) : "";
|
|
1137
|
-
}
|
|
1138
|
-
const recentPosts = formattedRecentPosts && formattedRecentPosts.length > 0 ? addHeader("# Posts in Thread", formattedRecentPosts) : "";
|
|
1139
|
-
const recentMessages = formattedRecentMessages && formattedRecentMessages.length > 0 ? addHeader("# Conversation Messages", formattedRecentMessages) : "";
|
|
1140
|
-
if (!recentPosts && !recentMessages && dialogueMessages.length === 0 && !message.content.text) {
|
|
1141
|
-
return {
|
|
1142
|
-
data: {
|
|
1143
|
-
summaries: [],
|
|
1144
|
-
recentMessages: [],
|
|
1145
|
-
recentInteractions: [],
|
|
1146
|
-
actionResults: [],
|
|
1147
|
-
mode: "full_conversation"
|
|
1148
|
-
},
|
|
1149
|
-
values: {
|
|
1150
|
-
recentPosts: "",
|
|
1151
|
-
recentMessages: "",
|
|
1152
|
-
recentMessageInteractions: "",
|
|
1153
|
-
recentPostInteractions: "",
|
|
1154
|
-
recentInteractions: "",
|
|
1155
|
-
recentActionResults: "",
|
|
1156
|
-
recentMessage: "No recent message available.",
|
|
1157
|
-
conversationLog: "",
|
|
1158
|
-
conversationLogWithAgentThoughts: ""
|
|
1159
|
-
},
|
|
1160
|
-
text: "No recent messages available"
|
|
1161
|
-
};
|
|
1162
|
-
}
|
|
1163
|
-
let recentMessage = "No recent message available.";
|
|
1164
|
-
if (dialogueMessages.length > 0) {
|
|
1165
|
-
const mostRecentMessage = [...dialogueMessages].sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0))[0];
|
|
1166
|
-
const formattedSingleMessage = formatMessages({
|
|
1167
|
-
messages: [mostRecentMessage],
|
|
1168
|
-
entities: entitiesData
|
|
1169
|
-
});
|
|
1170
|
-
if (formattedSingleMessage) {
|
|
1171
|
-
recentMessage = formattedSingleMessage;
|
|
1172
|
-
}
|
|
1173
|
-
}
|
|
1174
|
-
const metaData = message.metadata;
|
|
1175
|
-
const senderName = entitiesData.find((entity) => entity.id === message.entityId)?.names[0] || metaData?.entityName || "Unknown User";
|
|
1176
|
-
const receivedMessageContent = message.content.text;
|
|
1177
|
-
const hasReceivedMessage = !!receivedMessageContent?.trim();
|
|
1178
|
-
const receivedMessageHeader = hasReceivedMessage ? addHeader("# Received Message", `${senderName}: ${receivedMessageContent}`) : "";
|
|
1179
|
-
const focusHeader = hasReceivedMessage ? addHeader("# Focus your response", `You are replying to the above message from **${senderName}**. Keep your answer relevant to that message. Do not repeat earlier replies unless the sender asks again.`) : "";
|
|
1180
|
-
const interactionEntityMap = new Map;
|
|
1181
|
-
if (recentInteractionsData.length > 0) {
|
|
1182
|
-
const uniqueEntityIds = [
|
|
1183
|
-
...new Set(recentInteractionsData.map((message2) => message2.entityId).filter((id) => id !== runtime.agentId))
|
|
1184
|
-
];
|
|
1185
|
-
const uniqueEntityIdSet = new Set(uniqueEntityIds);
|
|
1186
|
-
const entitiesDataIdSet = new Set;
|
|
1187
|
-
entitiesData.forEach((entity) => {
|
|
1188
|
-
if (uniqueEntityIdSet.has(entity.id)) {
|
|
1189
|
-
interactionEntityMap.set(entity.id, entity);
|
|
1190
|
-
entitiesDataIdSet.add(entity.id);
|
|
1191
|
-
}
|
|
1192
|
-
});
|
|
1193
|
-
const remainingEntityIds = uniqueEntityIds.filter((id) => !entitiesDataIdSet.has(id));
|
|
1194
|
-
if (remainingEntityIds.length > 0) {
|
|
1195
|
-
const entities = await Promise.all(remainingEntityIds.map((entityId) => runtime.getEntityById(entityId)));
|
|
1196
|
-
entities.forEach((entity, index4) => {
|
|
1197
|
-
if (entity) {
|
|
1198
|
-
interactionEntityMap.set(remainingEntityIds[index4], entity);
|
|
1199
|
-
}
|
|
1200
|
-
});
|
|
1201
|
-
}
|
|
1202
|
-
}
|
|
1203
|
-
const getRecentMessageInteractions = async (recentInteractionsData2) => {
|
|
1204
|
-
const formattedInteractions = recentInteractionsData2.map((message2) => {
|
|
1205
|
-
const isSelf = message2.entityId === runtime.agentId;
|
|
1206
|
-
let sender;
|
|
1207
|
-
if (isSelf) {
|
|
1208
|
-
sender = runtime.character.name;
|
|
1209
|
-
} else {
|
|
1210
|
-
sender = interactionEntityMap.get(message2.entityId)?.metadata?.userName || "unknown";
|
|
1211
|
-
}
|
|
1212
|
-
return `${sender}: ${message2.content.text}`;
|
|
1213
|
-
});
|
|
1214
|
-
return formattedInteractions.join(`
|
|
1215
|
-
`);
|
|
1216
|
-
};
|
|
1217
|
-
const getRecentPostInteractions = async (recentInteractionsData2, entities) => {
|
|
1218
|
-
const combinedEntities = [...entities];
|
|
1219
|
-
const actorIds = new Set(entities.map((entity) => entity.id));
|
|
1220
|
-
for (const [id, entity] of interactionEntityMap.entries()) {
|
|
1221
|
-
if (!actorIds.has(id)) {
|
|
1222
|
-
combinedEntities.push(entity);
|
|
1223
|
-
}
|
|
1224
|
-
}
|
|
1225
|
-
const formattedInteractions = formatPosts({
|
|
1226
|
-
messages: recentInteractionsData2,
|
|
1227
|
-
entities: combinedEntities,
|
|
1228
|
-
conversationHeader: true
|
|
1229
|
-
});
|
|
1230
|
-
return formattedInteractions;
|
|
1231
|
-
};
|
|
1232
|
-
const [recentMessageInteractions, recentPostInteractions] = await Promise.all([
|
|
1233
|
-
getRecentMessageInteractions(recentInteractionsData),
|
|
1234
|
-
getRecentPostInteractions(recentInteractionsData, entitiesData)
|
|
1235
|
-
]);
|
|
1236
|
-
const data = {
|
|
1237
|
-
summaries: [],
|
|
1238
|
-
recentMessages: dialogueMessages,
|
|
1239
|
-
recentInteractions: recentInteractionsData,
|
|
1240
|
-
actionResults: actionResultMessages,
|
|
1241
|
-
mode: "full_conversation"
|
|
1242
|
-
};
|
|
1243
|
-
const values = {
|
|
1244
|
-
recentPosts,
|
|
1245
|
-
recentMessages,
|
|
1246
|
-
recentMessageInteractions,
|
|
1247
|
-
recentPostInteractions,
|
|
1248
|
-
recentInteractions: isPostFormat ? recentPostInteractions : recentMessageInteractions,
|
|
1249
|
-
recentActionResults: actionResultsText,
|
|
1250
|
-
recentMessage,
|
|
1251
|
-
conversationLog,
|
|
1252
|
-
conversationLogWithAgentThoughts
|
|
1253
|
-
};
|
|
1254
|
-
const text4 = [
|
|
1255
|
-
isPostFormat ? recentPosts : recentMessages,
|
|
1256
|
-
actionResultsText,
|
|
1257
|
-
recentMessages || recentPosts || message.content.text ? receivedMessageHeader : "",
|
|
1258
|
-
recentMessages || recentPosts || message.content.text ? focusHeader : ""
|
|
1259
|
-
].filter(Boolean).join(`
|
|
1260
|
-
|
|
1261
|
-
`);
|
|
1262
|
-
return {
|
|
1263
|
-
data,
|
|
1264
|
-
values,
|
|
1265
|
-
text: text4
|
|
1266
|
-
};
|
|
1267
|
-
} else {
|
|
1268
|
-
const currentSummary = await memoryService.getCurrentSessionSummary(roomId);
|
|
1269
|
-
const lastOffset = currentSummary?.lastMessageOffset || 0;
|
|
1270
|
-
const recentCount = config.shortTermRetainRecent;
|
|
1271
|
-
const [entitiesData, room, unsummarizedMessages, recentInteractionsData] = await Promise.all([
|
|
1272
|
-
getEntityDetails({ runtime, roomId }),
|
|
1273
|
-
runtime.getRoom(roomId),
|
|
1274
|
-
runtime.getMemories({
|
|
1275
|
-
tableName: "messages",
|
|
1276
|
-
roomId,
|
|
1277
|
-
count: recentCount,
|
|
1278
|
-
unique: false,
|
|
1279
|
-
start: lastOffset
|
|
1280
|
-
}),
|
|
1281
|
-
message.entityId !== runtime.agentId ? getRecentInteractions(runtime, message.entityId, runtime.agentId, roomId) : Promise.resolve([])
|
|
1282
|
-
]);
|
|
1283
|
-
const isPostFormat = room?.type ? room.type === ChannelType.FEED || room.type === ChannelType.THREAD : false;
|
|
1284
|
-
const actionResultMessages = unsummarizedMessages.filter((msg) => msg.content?.type === "action_result" && msg.metadata?.type === "action_result");
|
|
1285
|
-
const dialogueMessages = unsummarizedMessages.filter((msg) => !(msg.content?.type === "action_result" && msg.metadata?.type === "action_result"));
|
|
1286
|
-
let actionResultsText = "";
|
|
1287
|
-
if (actionResultMessages.length > 0) {
|
|
1288
|
-
const groupedByRun = new Map;
|
|
1289
|
-
for (const mem of actionResultMessages) {
|
|
1290
|
-
const runId = String(mem.content?.runId || "unknown");
|
|
1291
|
-
if (!groupedByRun.has(runId)) {
|
|
1292
|
-
groupedByRun.set(runId, []);
|
|
1293
|
-
}
|
|
1294
|
-
groupedByRun.get(runId)?.push(mem);
|
|
1295
|
-
}
|
|
1296
|
-
const formattedActionResults = Array.from(groupedByRun.entries()).slice(-3).map(([runId, memories]) => {
|
|
1297
|
-
const sortedMemories = memories.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0));
|
|
1298
|
-
const thought = sortedMemories[0]?.content?.planThought || "";
|
|
1299
|
-
const runText = sortedMemories.map((mem) => {
|
|
1300
|
-
const actionName = mem.content?.actionName || "Unknown";
|
|
1301
|
-
const status = mem.content?.actionStatus || "unknown";
|
|
1302
|
-
const planStep = mem.content?.planStep || "";
|
|
1303
|
-
const text5 = mem.content?.text || "";
|
|
1304
|
-
const error = mem.content?.error || "";
|
|
1305
|
-
let memText = ` - ${actionName} (${status})`;
|
|
1306
|
-
if (planStep)
|
|
1307
|
-
memText += ` [${planStep}]`;
|
|
1308
|
-
if (error) {
|
|
1309
|
-
memText += `: Error - ${error}`;
|
|
1310
|
-
} else if (text5 && text5 !== `Executed action: ${actionName}`) {
|
|
1311
|
-
memText += `: ${text5}`;
|
|
1312
|
-
}
|
|
1313
|
-
return memText;
|
|
1314
|
-
}).join(`
|
|
1315
|
-
`);
|
|
1316
|
-
return `**Action Run ${runId.slice(0, 8)}**${thought ? ` - "${thought}"` : ""}
|
|
1317
|
-
${runText}`;
|
|
1318
|
-
}).join(`
|
|
1319
|
-
|
|
1320
|
-
`);
|
|
1321
|
-
actionResultsText = formattedActionResults ? addHeader("# Recent Action Executions", formattedActionResults) : "";
|
|
1322
|
-
}
|
|
1323
|
-
let recentMessagesText = "";
|
|
1324
|
-
if (dialogueMessages.length > 0) {
|
|
1325
|
-
if (isPostFormat) {
|
|
1326
|
-
recentMessagesText = formatPosts({
|
|
1327
|
-
messages: dialogueMessages,
|
|
1328
|
-
entities: entitiesData,
|
|
1329
|
-
conversationHeader: false
|
|
1330
|
-
});
|
|
1331
|
-
} else {
|
|
1332
|
-
recentMessagesText = formatMessages({
|
|
1333
|
-
messages: dialogueMessages,
|
|
1334
|
-
entities: entitiesData
|
|
1335
|
-
});
|
|
1336
|
-
}
|
|
1337
|
-
if (recentMessagesText) {
|
|
1338
|
-
recentMessagesText = addHeader("# Recent Messages", recentMessagesText);
|
|
1339
|
-
}
|
|
1340
|
-
}
|
|
1341
|
-
let recentMessage = "No recent message available.";
|
|
1342
|
-
if (dialogueMessages.length > 0) {
|
|
1343
|
-
const mostRecentMessage = [...dialogueMessages].sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0))[0];
|
|
1344
|
-
const formattedSingleMessage = formatMessages({
|
|
1345
|
-
messages: [mostRecentMessage],
|
|
1346
|
-
entities: entitiesData
|
|
1347
|
-
});
|
|
1348
|
-
if (formattedSingleMessage) {
|
|
1349
|
-
recentMessage = formattedSingleMessage;
|
|
1350
|
-
}
|
|
1351
|
-
}
|
|
1352
|
-
const formatConversationLog = (messages, includeThoughts) => {
|
|
1353
|
-
return messages.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0)).map((msg) => {
|
|
1354
|
-
const entity = entitiesData.find((e) => e.id === msg.entityId);
|
|
1355
|
-
const entityName = entity?.names[0] || (msg.entityId === runtime.agentId ? runtime.character.name : "Unknown");
|
|
1356
|
-
const timestamp4 = msg.createdAt ? new Date(msg.createdAt).toLocaleString() : "Unknown time";
|
|
1357
|
-
const text5 = msg.content.text || "";
|
|
1358
|
-
const thought = includeThoughts && msg.content.internalMonologue ? `
|
|
1359
|
-
[Internal thought: ${msg.content.internalMonologue}]` : "";
|
|
1360
|
-
return `[${timestamp4}] ${entityName}: ${text5}${thought}`;
|
|
1361
|
-
}).join(`
|
|
1362
|
-
`);
|
|
1363
|
-
};
|
|
1364
|
-
const conversationLog = formatConversationLog(dialogueMessages, false);
|
|
1365
|
-
const conversationLogWithAgentThoughts = formatConversationLog(dialogueMessages, true);
|
|
1366
|
-
let summaryText = "";
|
|
1367
|
-
if (currentSummary) {
|
|
1368
|
-
const messageRange = `${currentSummary.messageCount} messages`;
|
|
1369
|
-
const timeRange = new Date(currentSummary.startTime).toLocaleDateString();
|
|
1370
|
-
summaryText = `**Previous Conversation** (${messageRange}, ${timeRange})
|
|
1371
|
-
`;
|
|
1372
|
-
summaryText += currentSummary.summary;
|
|
1373
|
-
if (currentSummary.topics && currentSummary.topics.length > 0) {
|
|
1374
|
-
summaryText += `
|
|
1375
|
-
*Topics: ${currentSummary.topics.join(", ")}*`;
|
|
1376
|
-
}
|
|
1377
|
-
summaryText = addHeader("# Conversation Summary", summaryText);
|
|
1378
|
-
}
|
|
1379
|
-
const metaData = message.metadata;
|
|
1380
|
-
const senderName = entitiesData.find((entity) => entity.id === message.entityId)?.names[0] || metaData?.entityName || "Unknown User";
|
|
1381
|
-
const receivedMessageContent = message.content.text;
|
|
1382
|
-
const hasReceivedMessage = !!receivedMessageContent?.trim();
|
|
1383
|
-
const receivedMessageHeader = hasReceivedMessage ? addHeader("# Received Message", `${senderName}: ${receivedMessageContent}`) : "";
|
|
1384
|
-
const focusHeader = hasReceivedMessage ? addHeader("# Focus your response", `You are replying to the above message from **${senderName}**. Keep your answer relevant to that message.`) : "";
|
|
1385
|
-
const interactionEntityMap = new Map;
|
|
1386
|
-
if (recentInteractionsData.length > 0) {
|
|
1387
|
-
const uniqueEntityIds = [
|
|
1388
|
-
...new Set(recentInteractionsData.map((message2) => message2.entityId).filter((id) => id !== runtime.agentId))
|
|
1389
|
-
];
|
|
1390
|
-
const uniqueEntityIdSet = new Set(uniqueEntityIds);
|
|
1391
|
-
const entitiesDataIdSet = new Set;
|
|
1392
|
-
entitiesData.forEach((entity) => {
|
|
1393
|
-
if (uniqueEntityIdSet.has(entity.id)) {
|
|
1394
|
-
interactionEntityMap.set(entity.id, entity);
|
|
1395
|
-
entitiesDataIdSet.add(entity.id);
|
|
1396
|
-
}
|
|
1397
|
-
});
|
|
1398
|
-
const remainingEntityIds = uniqueEntityIds.filter((id) => !entitiesDataIdSet.has(id));
|
|
1399
|
-
if (remainingEntityIds.length > 0) {
|
|
1400
|
-
const entities = await Promise.all(remainingEntityIds.map((entityId) => runtime.getEntityById(entityId)));
|
|
1401
|
-
entities.forEach((entity, index4) => {
|
|
1402
|
-
if (entity) {
|
|
1403
|
-
interactionEntityMap.set(remainingEntityIds[index4], entity);
|
|
1404
|
-
}
|
|
1405
|
-
});
|
|
1406
|
-
}
|
|
1407
|
-
}
|
|
1408
|
-
const getRecentMessageInteractions = async (recentInteractionsData2) => {
|
|
1409
|
-
const formattedInteractions = recentInteractionsData2.map((message2) => {
|
|
1410
|
-
const isSelf = message2.entityId === runtime.agentId;
|
|
1411
|
-
let sender;
|
|
1412
|
-
if (isSelf) {
|
|
1413
|
-
sender = runtime.character.name;
|
|
1414
|
-
} else {
|
|
1415
|
-
sender = interactionEntityMap.get(message2.entityId)?.metadata?.userName || "unknown";
|
|
1416
|
-
}
|
|
1417
|
-
return `${sender}: ${message2.content.text}`;
|
|
1418
|
-
});
|
|
1419
|
-
return formattedInteractions.join(`
|
|
1420
|
-
`);
|
|
1421
|
-
};
|
|
1422
|
-
const getRecentPostInteractions = async (recentInteractionsData2, entities) => {
|
|
1423
|
-
const combinedEntities = [...entities];
|
|
1424
|
-
const actorIds = new Set(entities.map((entity) => entity.id));
|
|
1425
|
-
for (const [id, entity] of interactionEntityMap.entries()) {
|
|
1426
|
-
if (!actorIds.has(id)) {
|
|
1427
|
-
combinedEntities.push(entity);
|
|
1428
|
-
}
|
|
1429
|
-
}
|
|
1430
|
-
const formattedInteractions = formatPosts({
|
|
1431
|
-
messages: recentInteractionsData2,
|
|
1432
|
-
entities: combinedEntities,
|
|
1433
|
-
conversationHeader: true
|
|
1434
|
-
});
|
|
1435
|
-
return formattedInteractions;
|
|
1436
|
-
};
|
|
1437
|
-
const [recentMessageInteractions, recentPostInteractions] = await Promise.all([
|
|
1438
|
-
getRecentMessageInteractions(recentInteractionsData),
|
|
1439
|
-
getRecentPostInteractions(recentInteractionsData, entitiesData)
|
|
1440
|
-
]);
|
|
1441
|
-
const text4 = [
|
|
1442
|
-
summaryText,
|
|
1443
|
-
recentMessagesText,
|
|
1444
|
-
actionResultsText,
|
|
1445
|
-
hasReceivedMessage ? receivedMessageHeader : "",
|
|
1446
|
-
hasReceivedMessage ? focusHeader : ""
|
|
1447
|
-
].filter(Boolean).join(`
|
|
1448
|
-
|
|
1449
|
-
`);
|
|
1450
|
-
return {
|
|
1451
|
-
data: {
|
|
1452
|
-
summaries: currentSummary ? [currentSummary] : [],
|
|
1453
|
-
recentMessages: dialogueMessages,
|
|
1454
|
-
recentInteractions: recentInteractionsData,
|
|
1455
|
-
actionResults: actionResultMessages,
|
|
1456
|
-
mode: "summarized"
|
|
1457
|
-
},
|
|
1458
|
-
values: {
|
|
1459
|
-
...summaryText && { sessionSummaries: summaryText },
|
|
1460
|
-
...recentMessagesText && { recentMessages: recentMessagesText },
|
|
1461
|
-
recentMessageInteractions,
|
|
1462
|
-
recentPostInteractions,
|
|
1463
|
-
recentInteractions: isPostFormat ? recentPostInteractions : recentMessageInteractions,
|
|
1464
|
-
...actionResultsText && { recentActionResults: actionResultsText },
|
|
1465
|
-
recentMessage,
|
|
1466
|
-
conversationLog,
|
|
1467
|
-
conversationLogWithAgentThoughts,
|
|
1468
|
-
...receivedMessageHeader && { receivedMessageHeader },
|
|
1469
|
-
...focusHeader && { focusHeader }
|
|
1470
|
-
},
|
|
1471
|
-
text: text4
|
|
1472
|
-
};
|
|
1473
|
-
}
|
|
1474
|
-
} catch (error) {
|
|
1475
|
-
logger4.error({ error }, "Error in shortTermMemoryProvider:");
|
|
1476
|
-
return {
|
|
1477
|
-
data: {
|
|
1478
|
-
summaries: [],
|
|
1479
|
-
recentMessages: [],
|
|
1480
|
-
recentInteractions: [],
|
|
1481
|
-
actionResults: [],
|
|
1482
|
-
mode: "error"
|
|
1483
|
-
},
|
|
1484
|
-
values: {
|
|
1485
|
-
recentPosts: "",
|
|
1486
|
-
recentMessages: "",
|
|
1487
|
-
recentMessageInteractions: "",
|
|
1488
|
-
recentPostInteractions: "",
|
|
1489
|
-
recentInteractions: "",
|
|
1490
|
-
recentActionResults: "",
|
|
1491
|
-
conversationLog: "",
|
|
1492
|
-
conversationLogWithAgentThoughts: ""
|
|
1493
|
-
},
|
|
1494
|
-
text: "Error retrieving conversation context."
|
|
1495
|
-
};
|
|
1496
|
-
}
|
|
1497
|
-
}
|
|
1498
|
-
};
|
|
1499
|
-
|
|
1500
1042
|
// src/providers/long-term-memory.ts
|
|
1501
1043
|
import {
|
|
1502
|
-
logger as
|
|
1503
|
-
addHeader
|
|
1044
|
+
logger as logger4,
|
|
1045
|
+
addHeader
|
|
1504
1046
|
} from "@elizaos/core";
|
|
1505
1047
|
var longTermMemoryProvider = {
|
|
1506
1048
|
name: "LONG_TERM_MEMORY",
|
|
@@ -1533,7 +1075,7 @@ var longTermMemoryProvider = {
|
|
|
1533
1075
|
};
|
|
1534
1076
|
}
|
|
1535
1077
|
const formattedMemories = await memoryService.getFormattedLongTermMemories(entityId);
|
|
1536
|
-
const text4 =
|
|
1078
|
+
const text4 = addHeader("# What I Know About You", formattedMemories);
|
|
1537
1079
|
const categoryCounts = new Map;
|
|
1538
1080
|
for (const memory of memories) {
|
|
1539
1081
|
const count = categoryCounts.get(memory.category) || 0;
|
|
@@ -1552,7 +1094,7 @@ var longTermMemoryProvider = {
|
|
|
1552
1094
|
text: text4
|
|
1553
1095
|
};
|
|
1554
1096
|
} catch (error) {
|
|
1555
|
-
|
|
1097
|
+
logger4.error({ error }, "Error in longTermMemoryProvider:");
|
|
1556
1098
|
return {
|
|
1557
1099
|
data: { memories: [] },
|
|
1558
1100
|
values: { longTermMemories: "" },
|
|
@@ -1562,24 +1104,237 @@ var longTermMemoryProvider = {
|
|
|
1562
1104
|
}
|
|
1563
1105
|
};
|
|
1564
1106
|
|
|
1107
|
+
// src/providers/context-summary.ts
|
|
1108
|
+
import {
|
|
1109
|
+
addHeader as addHeader2,
|
|
1110
|
+
logger as logger5
|
|
1111
|
+
} from "@elizaos/core";
|
|
1112
|
+
var contextSummaryProvider = {
|
|
1113
|
+
name: "SUMMARIZED_CONTEXT",
|
|
1114
|
+
description: "Provides summarized context from previous conversations",
|
|
1115
|
+
position: 96,
|
|
1116
|
+
get: async (runtime, message, _state) => {
|
|
1117
|
+
try {
|
|
1118
|
+
const memoryService = runtime.getService("memory");
|
|
1119
|
+
const { roomId } = message;
|
|
1120
|
+
if (!memoryService) {
|
|
1121
|
+
return {
|
|
1122
|
+
data: {
|
|
1123
|
+
summary: null
|
|
1124
|
+
},
|
|
1125
|
+
values: {
|
|
1126
|
+
sessionSummaries: "",
|
|
1127
|
+
sessionSummariesWithTopics: ""
|
|
1128
|
+
},
|
|
1129
|
+
text: ""
|
|
1130
|
+
};
|
|
1131
|
+
}
|
|
1132
|
+
const currentSummary = await memoryService.getCurrentSessionSummary(roomId);
|
|
1133
|
+
if (!currentSummary) {
|
|
1134
|
+
return {
|
|
1135
|
+
data: {
|
|
1136
|
+
summary: null
|
|
1137
|
+
},
|
|
1138
|
+
values: {
|
|
1139
|
+
sessionSummaries: "",
|
|
1140
|
+
sessionSummariesWithTopics: ""
|
|
1141
|
+
},
|
|
1142
|
+
text: ""
|
|
1143
|
+
};
|
|
1144
|
+
}
|
|
1145
|
+
const messageRange = `${currentSummary.messageCount} messages`;
|
|
1146
|
+
const timeRange = new Date(currentSummary.startTime).toLocaleDateString();
|
|
1147
|
+
let summaryOnly = `**Previous Conversation** (${messageRange}, ${timeRange})
|
|
1148
|
+
`;
|
|
1149
|
+
summaryOnly += currentSummary.summary;
|
|
1150
|
+
let summaryWithTopics = summaryOnly;
|
|
1151
|
+
if (currentSummary.topics && currentSummary.topics.length > 0) {
|
|
1152
|
+
summaryWithTopics += `
|
|
1153
|
+
*Topics: ${currentSummary.topics.join(", ")}*`;
|
|
1154
|
+
}
|
|
1155
|
+
const sessionSummaries2 = addHeader2("# Conversation Summary", summaryOnly);
|
|
1156
|
+
const sessionSummariesWithTopics = addHeader2("# Conversation Summary", summaryWithTopics);
|
|
1157
|
+
return {
|
|
1158
|
+
data: {
|
|
1159
|
+
summary: currentSummary
|
|
1160
|
+
},
|
|
1161
|
+
values: {
|
|
1162
|
+
sessionSummaries: sessionSummaries2,
|
|
1163
|
+
sessionSummariesWithTopics
|
|
1164
|
+
},
|
|
1165
|
+
text: sessionSummariesWithTopics
|
|
1166
|
+
};
|
|
1167
|
+
} catch (error) {
|
|
1168
|
+
logger5.error({ error }, "Error in contextSummaryProvider:");
|
|
1169
|
+
return {
|
|
1170
|
+
data: {
|
|
1171
|
+
summary: null
|
|
1172
|
+
},
|
|
1173
|
+
values: {
|
|
1174
|
+
sessionSummaries: "",
|
|
1175
|
+
sessionSummariesWithTopics: ""
|
|
1176
|
+
},
|
|
1177
|
+
text: ""
|
|
1178
|
+
};
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
};
|
|
1182
|
+
|
|
1183
|
+
// src/providers/recent-messages.ts
|
|
1184
|
+
import {
|
|
1185
|
+
addHeader as addHeader3,
|
|
1186
|
+
ChannelType,
|
|
1187
|
+
formatMessages,
|
|
1188
|
+
formatPosts,
|
|
1189
|
+
getEntityDetails,
|
|
1190
|
+
logger as logger6
|
|
1191
|
+
} from "@elizaos/core";
|
|
1192
|
+
var recentMessagesProvider = {
|
|
1193
|
+
name: "RECENT_MESSAGES",
|
|
1194
|
+
description: "Provides recent conversation messages with detailed context",
|
|
1195
|
+
position: 94,
|
|
1196
|
+
get: async (runtime, message, _state) => {
|
|
1197
|
+
try {
|
|
1198
|
+
const memoryService = runtime.getService("memory");
|
|
1199
|
+
const { roomId } = message;
|
|
1200
|
+
const config = memoryService?.getConfig() || {
|
|
1201
|
+
shortTermSummarizationThreshold: 16,
|
|
1202
|
+
shortTermRetainRecent: 6
|
|
1203
|
+
};
|
|
1204
|
+
const conversationLength = runtime.getConversationLength();
|
|
1205
|
+
let messagesToFetch = config.shortTermRetainRecent;
|
|
1206
|
+
let startOffset = 0;
|
|
1207
|
+
let hasSummary = false;
|
|
1208
|
+
if (memoryService) {
|
|
1209
|
+
const currentSummary = await memoryService.getCurrentSessionSummary(roomId);
|
|
1210
|
+
if (currentSummary) {
|
|
1211
|
+
hasSummary = true;
|
|
1212
|
+
startOffset = currentSummary.lastMessageOffset || 0;
|
|
1213
|
+
}
|
|
1214
|
+
}
|
|
1215
|
+
if (!hasSummary) {
|
|
1216
|
+
const allMessages = await runtime.getMemories({
|
|
1217
|
+
tableName: "messages",
|
|
1218
|
+
roomId,
|
|
1219
|
+
count: conversationLength,
|
|
1220
|
+
unique: false
|
|
1221
|
+
});
|
|
1222
|
+
const dialogueMessageCount = allMessages.filter((msg) => !(msg.content?.type === "action_result" && msg.metadata?.type === "action_result") && (msg.metadata?.type === "agent_response_message" || msg.metadata?.type === "user_message")).length;
|
|
1223
|
+
if (dialogueMessageCount < config.shortTermSummarizationThreshold) {
|
|
1224
|
+
messagesToFetch = conversationLength;
|
|
1225
|
+
}
|
|
1226
|
+
}
|
|
1227
|
+
const [entitiesData, room, recentMessagesData] = await Promise.all([
|
|
1228
|
+
getEntityDetails({ runtime, roomId }),
|
|
1229
|
+
runtime.getRoom(roomId),
|
|
1230
|
+
runtime.getMemories({
|
|
1231
|
+
tableName: "messages",
|
|
1232
|
+
roomId,
|
|
1233
|
+
count: messagesToFetch,
|
|
1234
|
+
unique: false,
|
|
1235
|
+
start: startOffset
|
|
1236
|
+
})
|
|
1237
|
+
]);
|
|
1238
|
+
const isPostFormat = room?.type ? room.type === ChannelType.FEED || room.type === ChannelType.THREAD : false;
|
|
1239
|
+
const dialogueMessages = recentMessagesData.filter((msg) => !(msg.content?.type === "action_result" && msg.metadata?.type === "action_result") && (msg.metadata?.type === "agent_response_message" || msg.metadata?.type === "user_message"));
|
|
1240
|
+
let recentMessagesText = "";
|
|
1241
|
+
if (dialogueMessages.length > 0) {
|
|
1242
|
+
if (isPostFormat) {
|
|
1243
|
+
recentMessagesText = formatPosts({
|
|
1244
|
+
messages: dialogueMessages,
|
|
1245
|
+
entities: entitiesData,
|
|
1246
|
+
conversationHeader: false
|
|
1247
|
+
});
|
|
1248
|
+
} else {
|
|
1249
|
+
recentMessagesText = formatMessages({
|
|
1250
|
+
messages: dialogueMessages,
|
|
1251
|
+
entities: entitiesData
|
|
1252
|
+
});
|
|
1253
|
+
}
|
|
1254
|
+
if (recentMessagesText) {
|
|
1255
|
+
recentMessagesText = addHeader3("# Recent Messages", recentMessagesText);
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1258
|
+
const formatConversationLog = (messages, includeThoughts) => {
|
|
1259
|
+
return messages.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0)).map((msg) => {
|
|
1260
|
+
const entity = entitiesData.find((e) => e.id === msg.entityId);
|
|
1261
|
+
const entityName = entity?.names[0] || (msg.entityId === runtime.agentId ? runtime.character.name : "Unknown");
|
|
1262
|
+
const timestamp4 = msg.createdAt ? new Date(msg.createdAt).toLocaleString() : "Unknown time";
|
|
1263
|
+
const text5 = msg.content.text || "";
|
|
1264
|
+
const thought = includeThoughts && msg.content.internalMonologue ? `
|
|
1265
|
+
[Internal thought: ${msg.content.internalMonologue}]` : "";
|
|
1266
|
+
return `[${timestamp4}] ${entityName}: ${text5}${thought}`;
|
|
1267
|
+
}).join(`
|
|
1268
|
+
`);
|
|
1269
|
+
};
|
|
1270
|
+
const conversationLog = addHeader3("# Conversation Messages", formatConversationLog(dialogueMessages, false));
|
|
1271
|
+
const conversationLogWithAgentThoughts = addHeader3("# Conversation Messages", formatConversationLog(dialogueMessages, true));
|
|
1272
|
+
const metaData = message.metadata;
|
|
1273
|
+
const senderName = entitiesData.find((entity) => entity.id === message.entityId)?.names[0] || metaData?.entityName || "Unknown User";
|
|
1274
|
+
const receivedMessageContent = message.content.text;
|
|
1275
|
+
const hasReceivedMessage = !!receivedMessageContent?.trim();
|
|
1276
|
+
const receivedMessageHeader = hasReceivedMessage ? addHeader3("# Received Message", `${senderName}: ${receivedMessageContent}`) : "";
|
|
1277
|
+
const focusHeader = hasReceivedMessage ? addHeader3("# Focus your response", `You are replying to the above message from **${senderName}**. Keep your answer relevant to that message.`) : "";
|
|
1278
|
+
const text4 = [recentMessagesText, receivedMessageHeader, focusHeader].filter(Boolean).join(`
|
|
1279
|
+
|
|
1280
|
+
`);
|
|
1281
|
+
return {
|
|
1282
|
+
data: {
|
|
1283
|
+
messages: dialogueMessages
|
|
1284
|
+
},
|
|
1285
|
+
values: {
|
|
1286
|
+
recentMessages: recentMessagesText,
|
|
1287
|
+
conversationLog,
|
|
1288
|
+
conversationLogWithAgentThoughts,
|
|
1289
|
+
...receivedMessageHeader && { receivedMessageHeader },
|
|
1290
|
+
...focusHeader && { focusHeader }
|
|
1291
|
+
},
|
|
1292
|
+
text: text4
|
|
1293
|
+
};
|
|
1294
|
+
} catch (error) {
|
|
1295
|
+
logger6.error({ error }, "Error in recentMessagesProvider:");
|
|
1296
|
+
return {
|
|
1297
|
+
data: {
|
|
1298
|
+
messages: []
|
|
1299
|
+
},
|
|
1300
|
+
values: {
|
|
1301
|
+
recentMessages: "",
|
|
1302
|
+
conversationLog: "",
|
|
1303
|
+
conversationLogWithAgentThoughts: "",
|
|
1304
|
+
receivedMessageHeader: "",
|
|
1305
|
+
focusHeader: ""
|
|
1306
|
+
},
|
|
1307
|
+
text: ""
|
|
1308
|
+
};
|
|
1309
|
+
}
|
|
1310
|
+
}
|
|
1311
|
+
};
|
|
1312
|
+
|
|
1565
1313
|
// src/index.ts
|
|
1566
1314
|
var memoryPlugin = {
|
|
1567
1315
|
name: "memory",
|
|
1568
1316
|
description: "Advanced memory management with conversation summarization and long-term persistent memory",
|
|
1569
1317
|
services: [MemoryService],
|
|
1570
1318
|
evaluators: [summarizationEvaluator, longTermExtractionEvaluator],
|
|
1571
|
-
providers: [
|
|
1319
|
+
providers: [
|
|
1320
|
+
longTermMemoryProvider,
|
|
1321
|
+
contextSummaryProvider,
|
|
1322
|
+
recentMessagesProvider
|
|
1323
|
+
],
|
|
1572
1324
|
schema: exports_schemas
|
|
1573
1325
|
};
|
|
1574
1326
|
var src_default = memoryPlugin;
|
|
1575
1327
|
export {
|
|
1576
1328
|
sessionSummaries,
|
|
1329
|
+
recentMessagesProvider,
|
|
1577
1330
|
memoryPlugin,
|
|
1578
1331
|
memoryAccessLogs,
|
|
1332
|
+
longTermMemoryProvider,
|
|
1579
1333
|
longTermMemories,
|
|
1580
1334
|
src_default as default,
|
|
1335
|
+
contextSummaryProvider,
|
|
1581
1336
|
MemoryService,
|
|
1582
1337
|
LongTermMemoryCategory
|
|
1583
1338
|
};
|
|
1584
1339
|
|
|
1585
|
-
//# debugId=
|
|
1340
|
+
//# debugId=755CC91A4D2723F764756E2164756E21
|