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