@langchain/community
Version:
Third-party integrations for LangChain.js
1 lines • 11.7 kB
Source Map (JSON)
{"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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"}