UNPKG

@langchain/community

Version:
138 lines (137 loc) 5.08 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 _langchain_core_chat_history = require("@langchain/core/chat_history"); let _planetscale_database = require("@planetscale/database"); //#region src/stores/message/planetscale.ts var planetscale_exports = /* @__PURE__ */ require_runtime.__exportAll({ PlanetScaleChatMessageHistory: () => PlanetScaleChatMessageHistory }); /** * Class for storing and retrieving chat message history from a * PlanetScale database. Extends the BaseListChatMessageHistory class. * @example * ```typescript * const chatHistory = new PlanetScaleChatMessageHistory({ * tableName: "stored_message", * sessionId: "lc-example", * config: { * url: "ADD_YOURS_HERE", * }, * }); * const chain = new ConversationChain({ * llm: new ChatOpenAI({ model: "gpt-4o-mini" }), * memory: chatHistory, * }); * const response = await chain.invoke({ * input: "What did I just say my name was?", * }); * console.log({ response }); * ``` */ var PlanetScaleChatMessageHistory = class extends _langchain_core_chat_history.BaseListChatMessageHistory { lc_namespace = [ "langchain", "stores", "message", "planetscale" ]; get lc_secrets() { return { "config.host": "PLANETSCALE_HOST", "config.username": "PLANETSCALE_USERNAME", "config.password": "PLANETSCALE_PASSWORD", "config.url": "PLANETSCALE_DATABASE_URL" }; } client; connection; tableName; sessionId; tableInitialized; constructor(fields) { super(fields); const { sessionId, config, client, tableName } = fields; if (client) this.client = client; else if (config) this.client = new _planetscale_database.Client(config); else throw new Error("Either a client or config must be provided to PlanetScaleChatMessageHistory"); this.connection = this.client.connection(); this.tableName = tableName || "langchain_chat_histories"; this.tableInitialized = false; this.sessionId = sessionId; } /** * Private method to ensure that the necessary table exists in the * PlanetScale database before performing any operations. If the table * does not exist, it is created. * @returns Promise that resolves to void. */ async ensureTable() { if (this.tableInitialized) return; const query = `CREATE TABLE IF NOT EXISTS ${this.tableName} (id BINARY(16) PRIMARY KEY, session_id VARCHAR(255), type VARCHAR(255), content VARCHAR(255), role VARCHAR(255), name VARCHAR(255), additional_kwargs VARCHAR(255));`; await this.connection.execute(query); const indexQuery = `ALTER TABLE ${this.tableName} MODIFY id BINARY(16) DEFAULT (UUID_TO_BIN(UUID()));`; await this.connection.execute(indexQuery); this.tableInitialized = true; } /** * Method to retrieve all messages from the PlanetScale database for the * current session. * @returns Promise that resolves to an array of BaseMessage objects. */ async getMessages() { await this.ensureTable(); const query = `SELECT * FROM ${this.tableName} WHERE session_id = :session_id`; const params = { session_id: this.sessionId }; return (0, _langchain_core_messages.mapStoredMessagesToChatMessages)((await this.connection.execute(query, params)).rows.map((message) => { const data = { content: message.content, additional_kwargs: JSON.parse(message.additional_kwargs) }; if (message.role) data.role = message.role; if (message.name) data.name = message.name; return { type: message.type, data }; })); } /** * Method to add a new message to the PlanetScale database for the current * session. * @param message The BaseMessage object to be added to the database. * @returns Promise that resolves to void. */ async addMessage(message) { await this.ensureTable(); const messageToAdd = (0, _langchain_core_messages.mapChatMessagesToStoredMessages)([message]); const query = `INSERT INTO ${this.tableName} (session_id, type, content, role, name, additional_kwargs) VALUES (:session_id, :type, :content, :role, :name, :additional_kwargs)`; const params = { session_id: this.sessionId, type: messageToAdd[0].type, content: messageToAdd[0].data.content, role: messageToAdd[0].data.role, name: messageToAdd[0].data.name, additional_kwargs: JSON.stringify(messageToAdd[0].data.additional_kwargs) }; await this.connection.execute(query, params); } /** * Method to delete all messages from the PlanetScale database for the * current session. * @returns Promise that resolves to void. */ async clear() { await this.ensureTable(); const query = `DELETE FROM ${this.tableName} WHERE session_id = :session_id`; const params = { session_id: this.sessionId }; await this.connection.execute(query, params); } }; //#endregion exports.PlanetScaleChatMessageHistory = PlanetScaleChatMessageHistory; Object.defineProperty(exports, "planetscale_exports", { enumerable: true, get: function() { return planetscale_exports; } }); //# sourceMappingURL=planetscale.cjs.map