{"version":3,"file":"cassandra.cjs","names":["BaseListChatMessageHistory","CassandraTable"],"sources":["../../../src/stores/message/cassandra.ts"],"sourcesContent":["import { BaseListChatMessageHistory } from \"@langchain/core/chat_history\";\nimport {\n  BaseMessage,\n  StoredMessage,\n  mapChatMessagesToStoredMessages,\n  mapStoredMessagesToChatMessages,\n} from \"@langchain/core/messages\";\n\nimport {\n  Column,\n  CassandraTable,\n  CassandraClientArgs,\n} from \"../../utils/cassandra.js\";\n\nexport interface CassandraChatMessageHistoryOptions extends CassandraClientArgs {\n  keyspace: string;\n  table: string;\n  sessionId: string;\n}\n\n/**\n * Class for storing chat message history within Cassandra. It extends the\n * BaseListChatMessageHistory class and provides methods to get, add, and\n * clear messages.\n * @example\n * ```typescript\n * const chatHistory = new CassandraChatMessageHistory({\n *   cloud: {\n *     secureConnectBundle: \"<path to your secure bundle>\",\n *   },\n *   credentials: {\n *     username: \"token\",\n *     password: \"<your Cassandra access token>\",\n *   },\n *   keyspace: \"langchain\",\n *   table: \"message_history\",\n *   sessionId: \"<some unique session identifier>\",\n * });\n *\n * const chain = new ConversationChain({\n *   llm: new ChatOpenAI({ model: \"gpt-4o-mini\" }),\n *   memory: chatHistory,\n * });\n *\n * const response = await chain.invoke({\n *   input: \"What did I just say my name was?\",\n * });\n * console.log({ response });\n * ```\n */\nexport class CassandraChatMessageHistory extends BaseListChatMessageHistory {\n  lc_namespace = [\"langchain\", \"stores\", \"message\", \"cassandra\"];\n\n  private cassandraTable: CassandraTable;\n\n  private sessionId: string;\n\n  private options: CassandraChatMessageHistoryOptions;\n\n  private colSessionId: Column;\n\n  private colMessageTs: Column;\n\n  private colMessageType: Column;\n\n  private colData: Column;\n\n  constructor(options: CassandraChatMessageHistoryOptions) {\n    super();\n    this.sessionId = options.sessionId;\n    this.options = options;\n\n    this.colSessionId = { name: \"session_id\", type: \"text\", partition: true };\n    this.colMessageTs = { name: \"message_ts\", type: \"timestamp\" };\n    this.colMessageType = { name: \"message_type\", type: \"text\" };\n    this.colData = { name: \"data\", type: \"text\" };\n  }\n\n  /**\n   * Method to get all the messages stored in the Cassandra database.\n   * @returns Array of stored BaseMessage instances.\n   */\n  public async getMessages(): Promise<BaseMessage[]> {\n    await this.ensureTable();\n\n    const resultSet = await this.cassandraTable.select(\n      [this.colMessageType, this.colData],\n      [{ name: \"session_id\", value: this.sessionId }]\n    );\n\n    const storedMessages: StoredMessage[] = resultSet.rows.map((row) => ({\n      type: row.message_type,\n      data: JSON.parse(row.data),\n    }));\n\n    const baseMessages = mapStoredMessagesToChatMessages(storedMessages);\n    return baseMessages;\n  }\n\n  /**\n   * Method to add a new message to the Cassandra database.\n   * @param message The BaseMessage instance to add.\n   * @returns A promise that resolves when the message has been added.\n   */\n  public async addMessage(message: BaseMessage): Promise<void> {\n    await this.ensureTable();\n    const messages = mapChatMessagesToStoredMessages([message]);\n    const { type, data } = messages[0];\n\n    return this.cassandraTable\n      .upsert(\n        [[this.sessionId, type, Date.now(), JSON.stringify(data)]],\n        [\n          this.colSessionId,\n          this.colMessageType,\n          this.colMessageTs,\n          this.colData,\n        ]\n      )\n      .then(() => {});\n  }\n\n  /**\n   * Method to clear all the messages from the Cassandra database.\n   * @returns A promise that resolves when all messages have been cleared.\n   */\n  public async clear(): Promise<void> {\n    await this.ensureTable();\n    return this.cassandraTable\n      .delete({ name: this.colSessionId.name, value: this.sessionId })\n      .then(() => {});\n  }\n\n  /**\n   * Method to initialize the Cassandra database.\n   * @returns Promise that resolves when the database has been initialized.\n   */\n  private async ensureTable(): Promise<void> {\n    if (this.cassandraTable) {\n      return;\n    }\n\n    const tableConfig = {\n      ...this.options,\n      primaryKey: [this.colSessionId, this.colMessageTs],\n      nonKeyColumns: [this.colMessageType, this.colData],\n    };\n\n    this.cassandraTable = await new CassandraTable(tableConfig);\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,IAAa,8BAAb,cAAiDA,6BAAAA,2BAA2B;CAC1E,eAAe;EAAC;EAAa;EAAU;EAAW;EAAY;CAE9D;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,YAAY,SAA6C;AACvD,SAAO;AACP,OAAK,YAAY,QAAQ;AACzB,OAAK,UAAU;AAEf,OAAK,eAAe;GAAE,MAAM;GAAc,MAAM;GAAQ,WAAW;GAAM;AACzE,OAAK,eAAe;GAAE,MAAM;GAAc,MAAM;GAAa;AAC7D,OAAK,iBAAiB;GAAE,MAAM;GAAgB,MAAM;GAAQ;AAC5D,OAAK,UAAU;GAAE,MAAM;GAAQ,MAAM;GAAQ;;;;;;CAO/C,MAAa,cAAsC;AACjD,QAAM,KAAK,aAAa;AAaxB,UAAA,GAAA,yBAAA,kCAXkB,MAAM,KAAK,eAAe,OAC1C,CAAC,KAAK,gBAAgB,KAAK,QAAQ,EACnC,CAAC;GAAE,MAAM;GAAc,OAAO,KAAK;GAAW,CAAC,CAChD,EAEiD,KAAK,KAAK,SAAS;GACnE,MAAM,IAAI;GACV,MAAM,KAAK,MAAM,IAAI,KAAK;GAC3B,EAAE,CAEiE;;;;;;;CAStE,MAAa,WAAW,SAAqC;AAC3D,QAAM,KAAK,aAAa;EAExB,MAAM,EAAE,MAAM,UAAA,GAAA,yBAAA,iCADmC,CAAC,QAAQ,CAAC,CAC3B;AAEhC,SAAO,KAAK,eACT,OACC,CAAC;GAAC,KAAK;GAAW;GAAM,KAAK,KAAK;GAAE,KAAK,UAAU,KAAK;GAAC,CAAC,EAC1D;GACE,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACN,CACF,CACA,WAAW,GAAG;;;;;;CAOnB,MAAa,QAAuB;AAClC,QAAM,KAAK,aAAa;AACxB,SAAO,KAAK,eACT,OAAO;GAAE,MAAM,KAAK,aAAa;GAAM,OAAO,KAAK;GAAW,CAAC,CAC/D,WAAW,GAAG;;;;;;CAOnB,MAAc,cAA6B;AACzC,MAAI,KAAK,eACP;AASF,OAAK,iBAAiB,MAAM,IAAIC,wBAAAA,eANZ;GAClB,GAAG,KAAK;GACR,YAAY,CAAC,KAAK,cAAc,KAAK,aAAa;GAClD,eAAe,CAAC,KAAK,gBAAgB,KAAK,QAAQ;GACnD,CAE0D"}