agsamantha/node_modules/langchain/dist/memory/summary.cjs

155 lines
5.8 KiB
JavaScript
Raw Normal View History

2024-10-02 15:15:21 -05:00
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConversationSummaryMemory = exports.BaseConversationSummaryMemory = void 0;
const messages_1 = require("@langchain/core/messages");
const llm_chain_js_1 = require("../chains/llm_chain.cjs");
const prompt_js_1 = require("./prompt.cjs");
const chat_memory_js_1 = require("./chat_memory.cjs");
/**
* Abstract class that provides a structure for storing and managing the
* memory of a conversation. It includes methods for predicting a new
* summary for the conversation given the existing messages and summary.
*/
class BaseConversationSummaryMemory extends chat_memory_js_1.BaseChatMemory {
constructor(fields) {
const { returnMessages, inputKey, outputKey, chatHistory, humanPrefix, aiPrefix, llm, prompt, summaryChatMessageClass, } = fields;
super({ returnMessages, inputKey, outputKey, chatHistory });
Object.defineProperty(this, "memoryKey", {
enumerable: true,
configurable: true,
writable: true,
value: "history"
});
Object.defineProperty(this, "humanPrefix", {
enumerable: true,
configurable: true,
writable: true,
value: "Human"
});
Object.defineProperty(this, "aiPrefix", {
enumerable: true,
configurable: true,
writable: true,
value: "AI"
});
Object.defineProperty(this, "llm", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "prompt", {
enumerable: true,
configurable: true,
writable: true,
value: prompt_js_1.SUMMARY_PROMPT
});
Object.defineProperty(this, "summaryChatMessageClass", {
enumerable: true,
configurable: true,
writable: true,
value: messages_1.SystemMessage
});
this.memoryKey = fields?.memoryKey ?? this.memoryKey;
this.humanPrefix = humanPrefix ?? this.humanPrefix;
this.aiPrefix = aiPrefix ?? this.aiPrefix;
this.llm = llm;
this.prompt = prompt ?? this.prompt;
this.summaryChatMessageClass =
summaryChatMessageClass ?? this.summaryChatMessageClass;
}
/**
* Predicts a new summary for the conversation given the existing messages
* and summary.
* @param messages Existing messages in the conversation.
* @param existingSummary Current summary of the conversation.
* @returns A promise that resolves to a new summary string.
*/
async predictNewSummary(messages, existingSummary) {
const newLines = (0, messages_1.getBufferString)(messages, this.humanPrefix, this.aiPrefix);
const chain = new llm_chain_js_1.LLMChain({ llm: this.llm, prompt: this.prompt });
return await chain.predict({
summary: existingSummary,
new_lines: newLines,
});
}
}
exports.BaseConversationSummaryMemory = BaseConversationSummaryMemory;
/**
* Class that provides a concrete implementation of the conversation
* memory. It includes methods for loading memory variables, saving
* context, and clearing the memory.
* @example
* ```typescript
* const memory = new ConversationSummaryMemory({
* memoryKey: "chat_history",
* llm: new ChatOpenAI({ modelName: "gpt-3.5-turbo", temperature: 0 }),
* });
*
* const model = new ChatOpenAI();
* const prompt =
* PromptTemplate.fromTemplate(`The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.
*
* Current conversation:
* {chat_history}
* Human: {input}
* AI:`);
* const chain = new LLMChain({ llm: model, prompt, memory });
*
* const res1 = await chain.call({ input: "Hi! I'm Jim." });
* console.log({ res1, memory: await memory.loadMemoryVariables({}) });
*
* const res2 = await chain.call({ input: "What's my name?" });
* console.log({ res2, memory: await memory.loadMemoryVariables({}) });
*
* ```
*/
class ConversationSummaryMemory extends BaseConversationSummaryMemory {
constructor(fields) {
super(fields);
Object.defineProperty(this, "buffer", {
enumerable: true,
configurable: true,
writable: true,
value: ""
});
}
get memoryKeys() {
return [this.memoryKey];
}
/**
* Loads the memory variables for the conversation memory.
* @returns A promise that resolves to an object containing the memory variables.
*/
async loadMemoryVariables(_) {
if (this.returnMessages) {
const result = {
[this.memoryKey]: [new this.summaryChatMessageClass(this.buffer)],
};
return result;
}
const result = { [this.memoryKey]: this.buffer };
return result;
}
/**
* Saves the context of the conversation memory.
* @param inputValues Input values for the conversation.
* @param outputValues Output values from the conversation.
* @returns A promise that resolves when the context has been saved.
*/
async saveContext(inputValues, outputValues) {
await super.saveContext(inputValues, outputValues);
const messages = await this.chatHistory.getMessages();
this.buffer = await this.predictNewSummary(messages.slice(-2), this.buffer);
}
/**
* Clears the conversation memory.
* @returns A promise that resolves when the memory has been cleared.
*/
async clear() {
await super.clear();
this.buffer = "";
}
}
exports.ConversationSummaryMemory = ConversationSummaryMemory;