UNPKG

@langchain/community

Version:
117 lines (116 loc) 4.36 kB
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const require_runtime = require("../../_virtual/_rolldown/runtime.cjs"); let _langchain_core_messages = require("@langchain/core/messages"); let neo4j_driver = require("neo4j-driver"); neo4j_driver = require_runtime.__toESM(neo4j_driver); let uuid = require("uuid"); let _langchain_core_chat_history = require("@langchain/core/chat_history"); //#region src/stores/message/neo4j.ts var neo4j_exports = /* @__PURE__ */ require_runtime.__exportAll({ Neo4jChatMessageHistory: () => Neo4jChatMessageHistory }); const defaultConfig = { sessionNodeLabel: "ChatSession", messageNodeLabel: "ChatMessage", windowSize: 3 }; var Neo4jChatMessageHistory = class Neo4jChatMessageHistory extends _langchain_core_chat_history.BaseListChatMessageHistory { lc_namespace = [ "langchain", "stores", "message", "neo4j" ]; sessionId; sessionNodeLabel; messageNodeLabel; windowSize; driver; constructor({ sessionId = (0, uuid.v4)(), sessionNodeLabel = defaultConfig.sessionNodeLabel, messageNodeLabel = defaultConfig.messageNodeLabel, url, username, password, windowSize = defaultConfig.windowSize }) { super(); this.sessionId = sessionId; this.sessionNodeLabel = sessionNodeLabel; this.messageNodeLabel = messageNodeLabel; this.windowSize = windowSize; if (url && username && password) try { this.driver = neo4j_driver.default.driver(url, neo4j_driver.auth.basic(username, password)); } catch (e) { throw new Error(`Could not create a Neo4j driver instance. Please check the connection details.\nCause: ${e.message}`); } else throw new Error("Neo4j connection details not provided."); } static async initialize(props) { const instance = new Neo4jChatMessageHistory(props); try { await instance.verifyConnectivity(); } catch (e) { throw new Error(`Could not verify connection to the Neo4j database.\nCause: ${e.message}`); } return instance; } async verifyConnectivity() { return await this.driver.getServerInfo(); } async getMessages() { const getMessagesCypherQuery = ` MERGE (chatSession:${this.sessionNodeLabel} {id: $sessionId}) WITH chatSession MATCH (chatSession)-[:LAST_MESSAGE]->(lastMessage) MATCH p=(lastMessage)<-[:NEXT*0..${this.windowSize * 2 - 1}]-() WITH p, length(p) AS length ORDER BY length DESC LIMIT 1 UNWIND reverse(nodes(p)) AS node RETURN {data:{content: node.content}, type:node.type} AS result `; try { const { records } = await this.driver.executeQuery(getMessagesCypherQuery, { sessionId: this.sessionId }); return (0, _langchain_core_messages.mapStoredMessagesToChatMessages)(records.map((record) => record.get("result"))); } catch (e) { throw new Error(`Ohno! Couldn't get messages.\nCause: ${e.message}`); } } async addMessage(message) { const addMessageCypherQuery = ` MERGE (chatSession:${this.sessionNodeLabel} {id: $sessionId}) WITH chatSession OPTIONAL MATCH (chatSession)-[lastMessageRel:LAST_MESSAGE]->(lastMessage) CREATE (chatSession)-[:LAST_MESSAGE]->(newLastMessage:${this.messageNodeLabel}) SET newLastMessage += {type:$type, content:$content} WITH newLastMessage, lastMessageRel, lastMessage WHERE lastMessage IS NOT NULL CREATE (lastMessage)-[:NEXT]->(newLastMessage) DELETE lastMessageRel `; try { await this.driver.executeQuery(addMessageCypherQuery, { sessionId: this.sessionId, type: message.getType(), content: message.content }); } catch (e) { throw new Error(`Ohno! Couldn't add message.\nCause: ${e.message}`); } } async clear() { const clearMessagesCypherQuery = ` MATCH p=(chatSession:${this.sessionNodeLabel} {id: $sessionId})-[:LAST_MESSAGE]->(lastMessage)<-[:NEXT*0..]-() UNWIND nodes(p) as node DETACH DELETE node `; try { await this.driver.executeQuery(clearMessagesCypherQuery, { sessionId: this.sessionId }); } catch (e) { throw new Error(`Ohno! Couldn't clear chat history.\nCause: ${e.message}`); } } async close() { await this.driver.close(); } }; //#endregion exports.Neo4jChatMessageHistory = Neo4jChatMessageHistory; Object.defineProperty(exports, "neo4j_exports", { enumerable: true, get: function() { return neo4j_exports; } }); //# sourceMappingURL=neo4j.cjs.map