{"version":3,"file":"dynamodb.cjs","names":["BaseListChatMessageHistory","message: StoredMessage","dynamoSerializedMessage: DynamoDBSerializedChatMessage","DynamoDBClient","params: GetItemCommandInput","GetItemCommand","data: {\n            role?: string;\n            content: string | undefined;\n            additional_kwargs?: Record<string, unknown>;\n          }","error: any","message: BaseMessage","params: UpdateItemCommandInput","UpdateItemCommand","messages: BaseMessage[]","params: DeleteItemCommandInput","DeleteItemCommand"],"sources":["../../../src/stores/message/dynamodb.ts"],"sourcesContent":["import {\n  DynamoDBClient,\n  DynamoDBClientConfig,\n  GetItemCommand,\n  GetItemCommandInput,\n  UpdateItemCommand,\n  UpdateItemCommandInput,\n  DeleteItemCommand,\n  DeleteItemCommandInput,\n  AttributeValue,\n} from \"@aws-sdk/client-dynamodb\";\n\nimport { BaseListChatMessageHistory } from \"@langchain/core/chat_history\";\nimport {\n  BaseMessage,\n  StoredMessage,\n  mapChatMessagesToStoredMessages,\n  mapStoredMessagesToChatMessages,\n} from \"@langchain/core/messages\";\n\n/**\n * Interface defining the fields required to create an instance of\n * `DynamoDBChatMessageHistory`. It includes the DynamoDB table name,\n * session ID, partition key, sort key, message attribute name, and\n * DynamoDB client configuration.\n */\nexport interface DynamoDBChatMessageHistoryFields {\n  tableName: string;\n  sessionId: string;\n  partitionKey?: string;\n  sortKey?: string;\n  messageAttributeName?: string;\n  config?: DynamoDBClientConfig;\n  key?: Record<string, AttributeValue>;\n}\n\n/**\n * Interface defining the structure of a chat message as it is stored in\n * DynamoDB.\n */\ninterface DynamoDBSerializedChatMessage {\n  M: {\n    type: {\n      S: string;\n    };\n    text: {\n      S: string;\n    };\n    role?: {\n      S: string;\n    };\n    additional_kwargs?: {\n      S: string;\n    };\n  };\n}\n\n/**\n * Class providing methods to interact with a DynamoDB table to store and\n * retrieve chat messages. It extends the `BaseListChatMessageHistory`\n * class.\n */\nexport class DynamoDBChatMessageHistory extends BaseListChatMessageHistory {\n  lc_namespace = [\"langchain\", \"stores\", \"message\", \"dynamodb\"];\n\n  get lc_secrets(): { [key: string]: string } | undefined {\n    return {\n      \"config.credentials.accessKeyId\": \"AWS_ACCESS_KEY_ID\",\n      \"config.credentials.secretAccessKey\": \"AWS_SECRETE_ACCESS_KEY\",\n      \"config.credentials.sessionToken\": \"AWS_SESSION_TOKEN\",\n    };\n  }\n\n  private tableName: string;\n\n  private sessionId: string;\n\n  private client: DynamoDBClient;\n\n  private partitionKey = \"id\";\n\n  private sortKey?: string;\n\n  private messageAttributeName = \"messages\";\n\n  private dynamoKey: Record<string, AttributeValue> = {};\n\n  /**\n   * Transforms a `StoredMessage` into a `DynamoDBSerializedChatMessage`.\n   * The `DynamoDBSerializedChatMessage` format is suitable for storing in DynamoDB.\n   *\n   * @param message - The `StoredMessage` to be transformed.\n   * @returns The transformed `DynamoDBSerializedChatMessage`.\n   */\n  private createDynamoDBSerializedChatMessage(\n    message: StoredMessage\n  ): DynamoDBSerializedChatMessage {\n    const {\n      type,\n      data: { content, role, additional_kwargs },\n    } = message;\n\n    const isAdditionalKwargs =\n      additional_kwargs && Object.keys(additional_kwargs).length;\n\n    const dynamoSerializedMessage: DynamoDBSerializedChatMessage = {\n      M: {\n        type: {\n          S: type,\n        },\n        text: {\n          S: content,\n        },\n        additional_kwargs: isAdditionalKwargs\n          ? { S: JSON.stringify(additional_kwargs) }\n          : { S: \"{}\" },\n      },\n    };\n\n    if (role) {\n      dynamoSerializedMessage.M.role = { S: role };\n    }\n\n    return dynamoSerializedMessage;\n  }\n\n  constructor({\n    tableName,\n    sessionId,\n    partitionKey,\n    sortKey,\n    messageAttributeName,\n    config,\n    key = {},\n  }: DynamoDBChatMessageHistoryFields) {\n    super();\n\n    this.tableName = tableName;\n    this.sessionId = sessionId;\n    this.client = new DynamoDBClient(config ?? {});\n    this.partitionKey = partitionKey ?? this.partitionKey;\n    this.sortKey = sortKey;\n    this.messageAttributeName =\n      messageAttributeName ?? this.messageAttributeName;\n    this.dynamoKey = key;\n\n    // override dynamoKey with partition key and sort key when key not specified\n    if (Object.keys(this.dynamoKey).length === 0) {\n      this.dynamoKey[this.partitionKey] = { S: this.sessionId };\n      if (this.sortKey) {\n        this.dynamoKey[this.sortKey] = { S: this.sortKey };\n      }\n    }\n  }\n\n  /**\n   * Retrieves all messages from the DynamoDB table and returns them as an\n   * array of `BaseMessage` instances.\n   * @returns Array of stored messages\n   */\n  async getMessages(): Promise<BaseMessage[]> {\n    try {\n      const params: GetItemCommandInput = {\n        TableName: this.tableName,\n        Key: this.dynamoKey,\n      };\n\n      const response = await this.client.send(new GetItemCommand(params));\n      const items = response.Item\n        ? (response.Item[this.messageAttributeName]?.L ?? [])\n        : [];\n      const messages = items\n        .filter(\n          (\n            item\n          ): item is AttributeValue & { M: DynamoDBSerializedChatMessage } =>\n            item.M !== undefined\n        )\n        .map((item) => {\n          const data: {\n            role?: string;\n            content: string | undefined;\n            additional_kwargs?: Record<string, unknown>;\n          } = {\n            role: item.M?.role?.S,\n            content: item.M?.text.S,\n            additional_kwargs: item.M?.additional_kwargs?.S\n              ? JSON.parse(item.M?.additional_kwargs.S)\n              : undefined,\n          };\n\n          return {\n            type: item.M?.type.S,\n            data,\n          };\n        })\n        .filter(\n          (x): x is StoredMessage =>\n            x.type !== undefined && x.data.content !== undefined\n        );\n      return mapStoredMessagesToChatMessages(messages);\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    } catch (error: any) {\n      throw new Error(`Error getting messages: ${error.message}`);\n    }\n  }\n\n  /**\n   * Adds a new message to the DynamoDB table.\n   * @param message The message to be added to the DynamoDB table.\n   */\n  async addMessage(message: BaseMessage) {\n    try {\n      const messages = mapChatMessagesToStoredMessages([message]);\n\n      const params: UpdateItemCommandInput = {\n        TableName: this.tableName,\n        Key: this.dynamoKey,\n        ExpressionAttributeNames: {\n          \"#m\": this.messageAttributeName,\n        },\n        ExpressionAttributeValues: {\n          \":empty_list\": {\n            L: [],\n          },\n          \":m\": {\n            L: messages.map(this.createDynamoDBSerializedChatMessage),\n          },\n        },\n        UpdateExpression:\n          \"SET #m = list_append(if_not_exists(#m, :empty_list), :m)\",\n      };\n      await this.client.send(new UpdateItemCommand(params));\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    } catch (error: any) {\n      throw new Error(`Error adding message: ${error.message}`);\n    }\n  }\n\n  /**\n   * Adds new messages to the DynamoDB table.\n   * @param messages The messages to be added to the DynamoDB table.\n   */\n  async addMessages(messages: BaseMessage[]): Promise<void> {\n    try {\n      const storedMessages = mapChatMessagesToStoredMessages(messages);\n      const dynamoMessages = storedMessages.map(\n        this.createDynamoDBSerializedChatMessage\n      );\n\n      const params: UpdateItemCommandInput = {\n        TableName: this.tableName,\n        Key: this.dynamoKey,\n        ExpressionAttributeNames: {\n          \"#m\": this.messageAttributeName,\n        },\n        ExpressionAttributeValues: {\n          \":empty_list\": {\n            L: [],\n          },\n          \":m\": {\n            L: dynamoMessages,\n          },\n        },\n        UpdateExpression:\n          \"SET #m = list_append(if_not_exists(#m, :empty_list), :m)\",\n      };\n      await this.client.send(new UpdateItemCommand(params));\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    } catch (error: any) {\n      throw new Error(`Error adding messages: ${error.message}`);\n    }\n  }\n\n  /**\n   * Deletes all messages from the DynamoDB table.\n   */\n  async clear(): Promise<void> {\n    try {\n      const params: DeleteItemCommandInput = {\n        TableName: this.tableName,\n        Key: this.dynamoKey,\n      };\n      await this.client.send(new DeleteItemCommand(params));\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    } catch (error: any) {\n      throw new Error(`Error clearing messages: ${error.message}`);\n    }\n  }\n}\n"],"mappings":"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"}