dtamind-components
Version:
Apps integration for Dtamind. Contain Nodes and Credentials.
151 lines • 6.37 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Interface_1 = require("../../../src/Interface");
const utils_1 = require("../../../src/utils");
const messages_1 = require("@langchain/core/messages");
const memory_1 = require("langchain/memory");
const DtamindChatAnthropic_1 = require("../../chatmodels/ChatAnthropic/DtamindChatAnthropic");
class ConversationSummaryBufferMemory_Memory {
constructor() {
this.label = 'Conversation Summary Buffer Memory';
this.name = 'conversationSummaryBufferMemory';
this.version = 1.0;
this.type = 'ConversationSummaryBufferMemory';
this.icon = 'memory.svg';
this.category = 'Memory';
this.description = 'Uses token length to decide when to summarize conversations';
this.baseClasses = [this.type, ...(0, utils_1.getBaseClasses)(memory_1.ConversationSummaryBufferMemory)];
this.inputs = [
{
label: 'Chat Model',
name: 'model',
type: 'BaseChatModel'
},
{
label: 'Max Token Limit',
name: 'maxTokenLimit',
type: 'number',
default: 2000,
description: 'Summarize conversations once token limit is reached. Default to 2000'
},
{
label: 'Session Id',
name: 'sessionId',
type: 'string',
description: 'If not specified, a random id will be used. Learn <a target="_blank" href="https://docs.dtamindai.com/memory#ui-and-embedded-chat">more</a>',
default: '',
optional: true,
additionalParams: true
},
{
label: 'Memory Key',
name: 'memoryKey',
type: 'string',
default: 'chat_history',
additionalParams: true
}
];
}
async init(nodeData, _, options) {
const model = nodeData.inputs?.model;
const _maxTokenLimit = nodeData.inputs?.maxTokenLimit;
const maxTokenLimit = _maxTokenLimit ? parseInt(_maxTokenLimit, 10) : 2000;
const sessionId = nodeData.inputs?.sessionId;
const memoryKey = nodeData.inputs?.memoryKey ?? 'chat_history';
const appDataSource = options.appDataSource;
const databaseEntities = options.databaseEntities;
const chatflowid = options.chatflowid;
const orgId = options.orgId;
const obj = {
llm: model,
sessionId,
memoryKey,
maxTokenLimit,
returnMessages: true,
appDataSource,
databaseEntities,
chatflowid,
orgId
};
return new ConversationSummaryBufferMemoryExtended(obj);
}
}
class ConversationSummaryBufferMemoryExtended extends Interface_1.DtamindSummaryBufferMemory {
constructor(fields) {
super(fields);
this.sessionId = '';
this.sessionId = fields.sessionId;
this.appDataSource = fields.appDataSource;
this.databaseEntities = fields.databaseEntities;
this.chatflowid = fields.chatflowid;
this.orgId = fields.orgId;
}
async getChatMessages(overrideSessionId = '', returnBaseMessages = false, prependMessages) {
const id = overrideSessionId ? overrideSessionId : this.sessionId;
if (!id)
return [];
let chatMessage = await this.appDataSource.getRepository(this.databaseEntities['ChatMessage']).find({
where: {
sessionId: id,
chatflowid: this.chatflowid
},
order: {
createdDate: 'ASC'
}
});
if (prependMessages?.length) {
chatMessage.unshift(...prependMessages);
}
let baseMessages = await (0, utils_1.mapChatMessageToBaseMessage)(chatMessage, this.orgId);
// Prune baseMessages if it exceeds max token limit
if (this.movingSummaryBuffer) {
baseMessages = [new this.summaryChatMessageClass(this.movingSummaryBuffer), ...baseMessages];
}
let currBufferLength = 0;
if (this.llm && typeof this.llm !== 'string') {
currBufferLength = await this.llm.getNumTokens((0, messages_1.getBufferString)(baseMessages, this.humanPrefix, this.aiPrefix));
if (currBufferLength > this.maxTokenLimit) {
const prunedMemory = [];
while (currBufferLength > this.maxTokenLimit) {
const poppedMessage = baseMessages.shift();
if (poppedMessage) {
prunedMemory.push(poppedMessage);
currBufferLength = await this.llm.getNumTokens((0, messages_1.getBufferString)(baseMessages, this.humanPrefix, this.aiPrefix));
}
}
this.movingSummaryBuffer = await this.predictNewSummary(prunedMemory, this.movingSummaryBuffer);
}
}
// ----------- Finished Pruning ---------------
if (this.movingSummaryBuffer) {
// Anthropic doesn't support multiple system messages
if (this.llm instanceof DtamindChatAnthropic_1.ChatAnthropic) {
baseMessages = [new messages_1.HumanMessage(`Below is the summarized conversation:\n\n${this.movingSummaryBuffer}`), ...baseMessages];
}
else {
baseMessages = [new this.summaryChatMessageClass(this.movingSummaryBuffer), ...baseMessages];
}
}
if (returnBaseMessages) {
return baseMessages;
}
let returnIMessages = [];
for (const m of baseMessages) {
returnIMessages.push({
message: m.content,
type: m._getType() === 'human' ? 'userMessage' : 'apiMessage'
});
}
return returnIMessages;
}
async addChatMessages() {
// adding chat messages is done on server level
return;
}
async clearChatMessages() {
// clearing chat messages is done on server level
return;
}
}
module.exports = { nodeClass: ConversationSummaryBufferMemory_Memory };
//# sourceMappingURL=ConversationSummaryBufferMemory.js.map