@farukada/aws-langgraph-dynamodb-ts 0.0.11 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +353 -242
- package/dist/checkpointer/actions/delete-thread.d.ts +3 -3
- package/dist/checkpointer/actions/delete-thread.d.ts.map +1 -1
- package/dist/checkpointer/actions/delete-thread.js +95 -52
- package/dist/checkpointer/actions/delete-thread.js.map +1 -1
- package/dist/checkpointer/actions/get-tuple.d.ts +8 -1
- package/dist/checkpointer/actions/get-tuple.d.ts.map +1 -1
- package/dist/checkpointer/actions/get-tuple.js +72 -20
- package/dist/checkpointer/actions/get-tuple.js.map +1 -1
- package/dist/checkpointer/actions/put-writes.d.ts.map +1 -1
- package/dist/checkpointer/actions/put-writes.js +27 -22
- package/dist/checkpointer/actions/put-writes.js.map +1 -1
- package/dist/checkpointer/actions/put.d.ts +6 -2
- package/dist/checkpointer/actions/put.d.ts.map +1 -1
- package/dist/checkpointer/actions/put.js +80 -19
- package/dist/checkpointer/actions/put.js.map +1 -1
- package/dist/checkpointer/index.d.ts +43 -2
- package/dist/checkpointer/index.d.ts.map +1 -1
- package/dist/checkpointer/index.js +226 -11
- package/dist/checkpointer/index.js.map +1 -1
- package/dist/checkpointer/types/index.d.ts +66 -4
- package/dist/checkpointer/types/index.d.ts.map +1 -1
- package/dist/checkpointer/types/index.js +10 -0
- package/dist/checkpointer/types/index.js.map +1 -1
- package/dist/checkpointer/utils/deserialization.d.ts +8 -3
- package/dist/checkpointer/utils/deserialization.d.ts.map +1 -1
- package/dist/checkpointer/utils/deserialization.js +23 -5
- package/dist/checkpointer/utils/deserialization.js.map +1 -1
- package/dist/checkpointer/utils/validation.d.ts +1 -1
- package/dist/checkpointer/utils/validation.js +1 -1
- package/dist/checkpointer/utils/validation.js.map +1 -1
- package/dist/factory.d.ts +8 -6
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +16 -4
- package/dist/factory.js.map +1 -1
- package/dist/history/actions/add-message.d.ts +2 -1
- package/dist/history/actions/add-message.d.ts.map +1 -1
- package/dist/history/actions/add-message.js +22 -18
- package/dist/history/actions/add-message.js.map +1 -1
- package/dist/history/actions/add-messages.d.ts +3 -2
- package/dist/history/actions/add-messages.d.ts.map +1 -1
- package/dist/history/actions/add-messages.js +30 -20
- package/dist/history/actions/add-messages.js.map +1 -1
- package/dist/history/actions/clear.d.ts +4 -3
- package/dist/history/actions/clear.d.ts.map +1 -1
- package/dist/history/actions/clear.js +47 -12
- package/dist/history/actions/clear.js.map +1 -1
- package/dist/history/actions/get-messages.d.ts +2 -1
- package/dist/history/actions/get-messages.d.ts.map +1 -1
- package/dist/history/actions/get-messages.js +41 -15
- package/dist/history/actions/get-messages.js.map +1 -1
- package/dist/history/actions/list-sessions.d.ts +11 -0
- package/dist/history/actions/list-sessions.d.ts.map +1 -1
- package/dist/history/actions/list-sessions.js +23 -3
- package/dist/history/actions/list-sessions.js.map +1 -1
- package/dist/history/index.d.ts +8 -0
- package/dist/history/index.d.ts.map +1 -1
- package/dist/history/index.js +22 -2
- package/dist/history/index.js.map +1 -1
- package/dist/history/types/index.d.ts +27 -5
- package/dist/history/types/index.d.ts.map +1 -1
- package/dist/history/types/index.js +1 -0
- package/dist/history/types/index.js.map +1 -1
- package/dist/history/utils/title-generator.js.map +1 -1
- package/dist/history/utils/update-expression-builder.d.ts +45 -21
- package/dist/history/utils/update-expression-builder.d.ts.map +1 -1
- package/dist/history/utils/update-expression-builder.js +105 -38
- package/dist/history/utils/update-expression-builder.js.map +1 -1
- package/dist/history/utils/validation.d.ts +8 -0
- package/dist/history/utils/validation.d.ts.map +1 -1
- package/dist/history/utils/validation.js +22 -0
- package/dist/history/utils/validation.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/shared/utils/batch-write.d.ts +36 -0
- package/dist/shared/utils/batch-write.d.ts.map +1 -0
- package/dist/shared/utils/batch-write.js +62 -0
- package/dist/shared/utils/batch-write.js.map +1 -0
- package/dist/shared/utils/compressor.d.ts +48 -0
- package/dist/shared/utils/compressor.d.ts.map +1 -0
- package/dist/shared/utils/compressor.js +68 -0
- package/dist/shared/utils/compressor.js.map +1 -0
- package/dist/shared/utils/constants.d.ts +2 -0
- package/dist/shared/utils/constants.d.ts.map +1 -1
- package/dist/shared/utils/constants.js +3 -7
- package/dist/shared/utils/constants.js.map +1 -1
- package/dist/shared/utils/index.d.ts +4 -0
- package/dist/shared/utils/index.d.ts.map +1 -1
- package/dist/shared/utils/index.js +4 -0
- package/dist/shared/utils/index.js.map +1 -1
- package/dist/shared/utils/logger.d.ts +48 -0
- package/dist/shared/utils/logger.d.ts.map +1 -0
- package/dist/shared/utils/logger.js +62 -0
- package/dist/shared/utils/logger.js.map +1 -0
- package/dist/shared/utils/retry.d.ts +1 -1
- package/dist/shared/utils/retry.d.ts.map +1 -1
- package/dist/shared/utils/retry.js +13 -6
- package/dist/shared/utils/retry.js.map +1 -1
- package/dist/shared/utils/s3-offloader.d.ts +146 -0
- package/dist/shared/utils/s3-offloader.d.ts.map +1 -0
- package/dist/shared/utils/s3-offloader.js +271 -0
- package/dist/shared/utils/s3-offloader.js.map +1 -0
- package/dist/shared/utils/ttl.d.ts +8 -1
- package/dist/shared/utils/ttl.d.ts.map +1 -1
- package/dist/shared/utils/ttl.js +12 -8
- package/dist/shared/utils/ttl.js.map +1 -1
- package/dist/store/actions/get-operation.js +2 -2
- package/dist/store/actions/get-operation.js.map +1 -1
- package/dist/store/actions/put-operation.d.ts.map +1 -1
- package/dist/store/actions/put-operation.js +2 -1
- package/dist/store/actions/put-operation.js.map +1 -1
- package/dist/store/actions/search-operation.d.ts +6 -0
- package/dist/store/actions/search-operation.d.ts.map +1 -1
- package/dist/store/actions/search-operation.js +41 -21
- package/dist/store/actions/search-operation.js.map +1 -1
- package/dist/store/index.d.ts +10 -2
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +28 -5
- package/dist/store/index.js.map +1 -1
- package/dist/store/types/index.d.ts +7 -5
- package/dist/store/types/index.d.ts.map +1 -1
- package/dist/store/utils/index.d.ts +0 -1
- package/dist/store/utils/index.d.ts.map +1 -1
- package/dist/store/utils/index.js +0 -1
- package/dist/store/utils/index.js.map +1 -1
- package/dist/store/utils/validation.js +1 -1
- package/dist/store/utils/validation.js.map +1 -1
- package/package.json +43 -26
- package/dist/store/utils/result.d.ts +0 -42
- package/dist/store/utils/result.d.ts.map +0 -1
- package/dist/store/utils/result.js +0 -51
- package/dist/store/utils/result.js.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { DeleteThreadActionParams } from '../types';
|
|
1
|
+
import { type DeleteThreadActionParams } from '../types';
|
|
2
2
|
/**
|
|
3
|
-
* Delete a thread and all its checkpoints and writes from DynamoDB
|
|
3
|
+
* Delete a thread and all its checkpoints (metadata + payload items) and writes from DynamoDB
|
|
4
4
|
*
|
|
5
5
|
* @param params - Parameters for the delete thread operation
|
|
6
|
-
* @throws Error if validation fails or too many
|
|
6
|
+
* @throws Error if validation fails or too many items exist
|
|
7
7
|
*/
|
|
8
8
|
export declare const deleteThreadAction: (params: DeleteThreadActionParams) => Promise<void>;
|
|
9
9
|
//# sourceMappingURL=delete-thread.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-thread.d.ts","sourceRoot":"","sources":["../../../src/checkpointer/actions/delete-thread.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delete-thread.d.ts","sourceRoot":"","sources":["../../../src/checkpointer/actions/delete-thread.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,wBAAwB,EAG9B,MAAM,UAAU,CAAC;AAclB;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAU,QAAQ,wBAAwB,KAAG,OAAO,CAAC,IAAI,CAwIvF,CAAC"}
|
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.deleteThreadAction = void 0;
|
|
4
|
-
const writer_1 = require("./writer");
|
|
5
|
-
const utils_1 = require("../utils");
|
|
6
4
|
const shared_1 = require("../../shared");
|
|
5
|
+
const types_1 = require("../types");
|
|
6
|
+
const utils_1 = require("../utils");
|
|
7
|
+
const writer_1 = require("./writer");
|
|
7
8
|
/**
|
|
8
|
-
* Delete a thread and all its checkpoints and writes from DynamoDB
|
|
9
|
+
* Delete a thread and all its checkpoints (metadata + payload items) and writes from DynamoDB
|
|
9
10
|
*
|
|
10
11
|
* @param params - Parameters for the delete thread operation
|
|
11
|
-
* @throws Error if validation fails or too many
|
|
12
|
+
* @throws Error if validation fails or too many items exist
|
|
12
13
|
*/
|
|
13
14
|
const deleteThreadAction = async (params) => {
|
|
14
15
|
// Validate thread ID
|
|
15
16
|
(0, utils_1.validateThreadId)(params.threadId);
|
|
16
|
-
|
|
17
|
+
// Query returns BOTH metadata items and PAYLOAD# items for the thread
|
|
18
|
+
const allItems = [];
|
|
17
19
|
let lastEvaluatedKey;
|
|
18
20
|
let iterationCount = 0;
|
|
19
21
|
const MAX_ITERATIONS = 10;
|
|
20
|
-
// Fetch
|
|
22
|
+
// Fetch all items with pagination and safety limits
|
|
21
23
|
do {
|
|
22
24
|
iterationCount++;
|
|
23
25
|
if (iterationCount > MAX_ITERATIONS) {
|
|
@@ -35,19 +37,40 @@ const deleteThreadAction = async (params) => {
|
|
|
35
37
|
});
|
|
36
38
|
});
|
|
37
39
|
if (result.Items && result.Items.length > 0) {
|
|
38
|
-
|
|
39
|
-
// Safety check: prevent deleting too many
|
|
40
|
-
if (
|
|
41
|
-
throw new Error(`Thread has too many
|
|
40
|
+
allItems.push(...result.Items);
|
|
41
|
+
// Safety check: prevent deleting too many items at once
|
|
42
|
+
if (allItems.length > utils_1.CheckpointerValidationConstants.MAX_DELETE_BATCH_SIZE) {
|
|
43
|
+
throw new Error(`Thread has too many items (>${utils_1.CheckpointerValidationConstants.MAX_DELETE_BATCH_SIZE}). Delete operation aborted for safety.`);
|
|
42
44
|
}
|
|
43
45
|
}
|
|
44
46
|
lastEvaluatedKey = result.LastEvaluatedKey;
|
|
45
47
|
} while (lastEvaluatedKey);
|
|
46
|
-
if (
|
|
48
|
+
if (allItems.length === 0) {
|
|
47
49
|
return; // Nothing to delete
|
|
48
50
|
}
|
|
49
|
-
//
|
|
50
|
-
const
|
|
51
|
+
// Separate metadata items from payload items
|
|
52
|
+
const metadataItems = [];
|
|
53
|
+
for (const item of allItems) {
|
|
54
|
+
// Skip items without checkpoint_id or those with PAYLOAD# prefix
|
|
55
|
+
const ckptId = item.checkpoint_id;
|
|
56
|
+
if (typeof ckptId === 'string' && !ckptId.startsWith(types_1.PAYLOAD_SK_PREFIX)) {
|
|
57
|
+
metadataItems.push(item);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Collect S3 keys from metadata items only (payload items don't carry S3 refs)
|
|
61
|
+
const s3KeysToDelete = [];
|
|
62
|
+
if (params.s3Offloader) {
|
|
63
|
+
for (const item of metadataItems) {
|
|
64
|
+
if (item.s3_checkpoint_key) {
|
|
65
|
+
s3KeysToDelete.push(item.s3_checkpoint_key);
|
|
66
|
+
}
|
|
67
|
+
if (item.s3_metadata_key) {
|
|
68
|
+
s3KeysToDelete.push(item.s3_metadata_key);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Delete ALL items (metadata + payload) using their actual PK+SK
|
|
73
|
+
const checkpointDeleteRequests = allItems.map((item) => ({
|
|
51
74
|
DeleteRequest: {
|
|
52
75
|
Key: {
|
|
53
76
|
thread_id: item.thread_id,
|
|
@@ -55,22 +78,59 @@ const deleteThreadAction = async (params) => {
|
|
|
55
78
|
},
|
|
56
79
|
},
|
|
57
80
|
}));
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
await (0, shared_1.withDynamoDBRetry)(async () => {
|
|
61
|
-
await params.client.batchWrite({
|
|
62
|
-
RequestItems: {
|
|
63
|
-
[params.checkpointsTableName]: batch,
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
// Delete associated writes - batch queries to avoid the N+1 problem
|
|
81
|
+
await (0, shared_1.batchWriteAllWithRetry)(params.client, params.checkpointsTableName, checkpointDeleteRequests);
|
|
82
|
+
// Fetch writes for metadata items only (payload items don't have associated writes)
|
|
69
83
|
const allWriteDeleteRequests = [];
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
84
|
+
const QUERY_CONCURRENCY = 10;
|
|
85
|
+
for (let i = 0; i < metadataItems.length; i += QUERY_CONCURRENCY) {
|
|
86
|
+
const checkpointBatch = metadataItems.slice(i, i + QUERY_CONCURRENCY);
|
|
87
|
+
const writesResults = await Promise.all(checkpointBatch.map((checkpoint) => queryAllWritesForCheckpoint(params.client, params.writesTableName, checkpoint)));
|
|
88
|
+
for (const writeItems of writesResults) {
|
|
89
|
+
if (writeItems.length > 0) {
|
|
90
|
+
const deleteRequests = writeItems.map((item) => ({
|
|
91
|
+
DeleteRequest: {
|
|
92
|
+
Key: {
|
|
93
|
+
thread_id_checkpoint_id_checkpoint_ns: item.thread_id_checkpoint_id_checkpoint_ns,
|
|
94
|
+
task_id_idx: item.task_id_idx,
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
}));
|
|
98
|
+
allWriteDeleteRequests.push(...deleteRequests);
|
|
99
|
+
// Collect S3 keys from write items
|
|
100
|
+
if (params.s3Offloader) {
|
|
101
|
+
for (const item of writeItems) {
|
|
102
|
+
if (item.s3_value_key) {
|
|
103
|
+
s3KeysToDelete.push(item.s3_value_key);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Delete all writes using shared batch write utility
|
|
111
|
+
await (0, shared_1.batchWriteAllWithRetry)(params.client, params.writesTableName, allWriteDeleteRequests);
|
|
112
|
+
// Clean up S3 offloaded data
|
|
113
|
+
if (params.s3Offloader && s3KeysToDelete.length > 0) {
|
|
114
|
+
await params.s3Offloader.deleteBatch(s3KeysToDelete);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
exports.deleteThreadAction = deleteThreadAction;
|
|
118
|
+
/**
|
|
119
|
+
* Fetch all writes for a single checkpoint, paginating through results.
|
|
120
|
+
* DynamoDB Query returns at most 1 MB per call — this loop ensures all writes are collected.
|
|
121
|
+
*
|
|
122
|
+
* @param client - DynamoDB Document client
|
|
123
|
+
* @param tableName - Writes table name
|
|
124
|
+
* @param checkpoint - Checkpoint metadata item
|
|
125
|
+
* @returns All write items for this checkpoint
|
|
126
|
+
*/
|
|
127
|
+
async function queryAllWritesForCheckpoint(client, tableName, checkpoint) {
|
|
128
|
+
const allItems = [];
|
|
129
|
+
let lastKey;
|
|
130
|
+
do {
|
|
131
|
+
const result = await (0, shared_1.withDynamoDBRetry)(async () => {
|
|
132
|
+
return await client.query({
|
|
133
|
+
TableName: tableName,
|
|
74
134
|
KeyConditionExpression: 'thread_id_checkpoint_id_checkpoint_ns = :pk',
|
|
75
135
|
ExpressionAttributeValues: {
|
|
76
136
|
':pk': writer_1.Writer.getPartitionKey({
|
|
@@ -79,31 +139,14 @@ const deleteThreadAction = async (params) => {
|
|
|
79
139
|
checkpoint_ns: checkpoint.checkpoint_ns,
|
|
80
140
|
}),
|
|
81
141
|
},
|
|
142
|
+
ExclusiveStartKey: lastKey,
|
|
82
143
|
});
|
|
83
144
|
});
|
|
84
|
-
if (
|
|
85
|
-
|
|
86
|
-
DeleteRequest: {
|
|
87
|
-
Key: {
|
|
88
|
-
thread_id_checkpoint_id_checkpoint_ns: item.thread_id_checkpoint_id_checkpoint_ns,
|
|
89
|
-
task_id_idx: item.task_id_idx,
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
}));
|
|
93
|
-
allWriteDeleteRequests.push(...deleteRequests);
|
|
145
|
+
if (result.Items) {
|
|
146
|
+
allItems.push(...result.Items);
|
|
94
147
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
await (0, shared_1.withDynamoDBRetry)(async () => {
|
|
100
|
-
await params.client.batchWrite({
|
|
101
|
-
RequestItems: {
|
|
102
|
-
[params.writesTableName]: batch,
|
|
103
|
-
},
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
exports.deleteThreadAction = deleteThreadAction;
|
|
148
|
+
lastKey = result.LastEvaluatedKey;
|
|
149
|
+
} while (lastKey);
|
|
150
|
+
return allItems;
|
|
151
|
+
}
|
|
109
152
|
//# sourceMappingURL=delete-thread.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-thread.js","sourceRoot":"","sources":["../../../src/checkpointer/actions/delete-thread.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"delete-thread.js","sourceRoot":"","sources":["../../../src/checkpointer/actions/delete-thread.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import type { CheckpointTuple } from '@langchain/langgraph-checkpoint';
|
|
2
|
-
import { GetTupleActionParams } from '../types';
|
|
2
|
+
import { type GetTupleActionParams } from '../types';
|
|
3
3
|
/**
|
|
4
4
|
* Get a checkpoint tuple from DynamoDB
|
|
5
5
|
*
|
|
6
|
+
* Fetches two items from the checkpoints table:
|
|
7
|
+
* 1. Metadata item (SK = checkpoint_id) — contains metadata, S3 refs, type
|
|
8
|
+
* 2. Payload item (SK = PAYLOAD#checkpoint_id) — contains the heavy checkpoint blob
|
|
9
|
+
*
|
|
10
|
+
* For backward compatibility, also handles legacy single-item format where the
|
|
11
|
+
* checkpoint blob is stored inline on the metadata item.
|
|
12
|
+
*
|
|
6
13
|
* @param params - Parameters for the get tuple operation
|
|
7
14
|
* @returns CheckpointTuple if found, undefined otherwise
|
|
8
15
|
* @throws Error if operation fails
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-tuple.d.ts","sourceRoot":"","sources":["../../../src/checkpointer/actions/get-tuple.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA0B,eAAe,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"get-tuple.d.ts","sourceRoot":"","sources":["../../../src/checkpointer/actions/get-tuple.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA0B,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAG/F,OAAO,EAIL,KAAK,oBAAoB,EAG1B,MAAM,UAAU,CAAC;AAKlB;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,GACzB,QAAQ,oBAAoB,KAC3B,OAAO,CAAC,eAAe,GAAG,SAAS,CA4HrC,CAAC"}
|
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getTupleAction = void 0;
|
|
4
|
-
const writer_1 = require("./writer");
|
|
5
|
-
const validate_configurable_1 = require("./validate-configurable");
|
|
6
|
-
const utils_1 = require("../utils");
|
|
7
4
|
const shared_1 = require("../../shared");
|
|
5
|
+
const types_1 = require("../types");
|
|
6
|
+
const utils_1 = require("../utils");
|
|
7
|
+
const validate_configurable_1 = require("./validate-configurable");
|
|
8
|
+
const writer_1 = require("./writer");
|
|
8
9
|
/**
|
|
9
10
|
* Get a checkpoint tuple from DynamoDB
|
|
10
11
|
*
|
|
12
|
+
* Fetches two items from the checkpoints table:
|
|
13
|
+
* 1. Metadata item (SK = checkpoint_id) — contains metadata, S3 refs, type
|
|
14
|
+
* 2. Payload item (SK = PAYLOAD#checkpoint_id) — contains the heavy checkpoint blob
|
|
15
|
+
*
|
|
16
|
+
* For backward compatibility, also handles legacy single-item format where the
|
|
17
|
+
* checkpoint blob is stored inline on the metadata item.
|
|
18
|
+
*
|
|
11
19
|
* @param params - Parameters for the get tuple operation
|
|
12
20
|
* @returns CheckpointTuple if found, undefined otherwise
|
|
13
21
|
* @throws Error if operation fails
|
|
@@ -30,9 +38,10 @@ const getTupleAction = async (params) => {
|
|
|
30
38
|
const result = await (0, shared_1.withDynamoDBRetry)(async () => {
|
|
31
39
|
return await params.client.query({
|
|
32
40
|
TableName: params.checkpointsTableName,
|
|
33
|
-
KeyConditionExpression: 'thread_id = :thread_id',
|
|
41
|
+
KeyConditionExpression: 'thread_id = :thread_id AND checkpoint_id < :payload_prefix',
|
|
34
42
|
ExpressionAttributeValues: {
|
|
35
43
|
':thread_id': configurable.thread_id,
|
|
44
|
+
':payload_prefix': types_1.PAYLOAD_SK_PREFIX,
|
|
36
45
|
...(configurable.checkpoint_ns && {
|
|
37
46
|
':checkpoint_ns': configurable.checkpoint_ns,
|
|
38
47
|
}),
|
|
@@ -52,26 +61,69 @@ const getTupleAction = async (params) => {
|
|
|
52
61
|
if (!item) {
|
|
53
62
|
return undefined;
|
|
54
63
|
}
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
64
|
+
// Fetch the payload item (heavy checkpoint blob)
|
|
65
|
+
// Optimization: if checkpoint data is stored in S3, skip the payload fetch —
|
|
66
|
+
// deserializeCheckpointTuple will download the real data from S3.
|
|
67
|
+
let checkpointData;
|
|
68
|
+
if (item.s3_checkpoint_key) {
|
|
69
|
+
// S3 offloaded — real data will be fetched by deserializeCheckpointTuple
|
|
70
|
+
checkpointData = new Uint8Array(0);
|
|
71
|
+
}
|
|
72
|
+
else if (item.checkpoint && item.checkpoint.length > 0) {
|
|
73
|
+
// Legacy single-item format — checkpoint blob is inline
|
|
74
|
+
checkpointData = item.checkpoint;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// New split format — fetch payload item separately
|
|
78
|
+
const payloadResult = await (0, shared_1.withDynamoDBRetry)(async () => {
|
|
79
|
+
return await params.client.get({
|
|
80
|
+
TableName: params.checkpointsTableName,
|
|
81
|
+
Key: {
|
|
82
|
+
thread_id: item.thread_id,
|
|
83
|
+
checkpoint_id: `${types_1.PAYLOAD_SK_PREFIX}${item.checkpoint_id}`,
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
const payloadItem = payloadResult.Item;
|
|
88
|
+
if (!payloadItem) {
|
|
89
|
+
throw new Error(`Checkpoint payload item not found for thread_id=${item.thread_id}, checkpoint_id=${item.checkpoint_id}`);
|
|
90
|
+
}
|
|
91
|
+
checkpointData = payloadItem.checkpoint;
|
|
92
|
+
}
|
|
93
|
+
// Get pending writes for this checkpoint (with pagination for large result sets)
|
|
94
|
+
const allWriteItems = [];
|
|
95
|
+
let writesLastEvaluatedKey;
|
|
96
|
+
do {
|
|
97
|
+
const writesResult = await (0, shared_1.withDynamoDBRetry)(async () => {
|
|
98
|
+
return await params.client.query({
|
|
99
|
+
TableName: params.writesTableName,
|
|
100
|
+
KeyConditionExpression: 'thread_id_checkpoint_id_checkpoint_ns = :thread_id_checkpoint_id_checkpoint_ns',
|
|
101
|
+
ExpressionAttributeValues: {
|
|
102
|
+
':thread_id_checkpoint_id_checkpoint_ns': writer_1.Writer.getPartitionKey(item),
|
|
103
|
+
},
|
|
104
|
+
ExclusiveStartKey: writesLastEvaluatedKey,
|
|
105
|
+
});
|
|
63
106
|
});
|
|
64
|
-
|
|
107
|
+
if (writesResult.Items) {
|
|
108
|
+
allWriteItems.push(...writesResult.Items);
|
|
109
|
+
}
|
|
110
|
+
writesLastEvaluatedKey = writesResult.LastEvaluatedKey;
|
|
111
|
+
} while (writesLastEvaluatedKey);
|
|
65
112
|
const pendingWrites = [];
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
113
|
+
for (const writeItem of allWriteItems) {
|
|
114
|
+
const write = writer_1.Writer.fromDynamoDBItem(writeItem);
|
|
115
|
+
// Download from S3 if offloaded
|
|
116
|
+
let rawValue = write.value;
|
|
117
|
+
if (writeItem.s3_value_key && params.s3Offloader) {
|
|
118
|
+
rawValue = await params.s3Offloader.download(writeItem.s3_value_key);
|
|
71
119
|
}
|
|
120
|
+
// Decompress write value if compressor is provided (auto-detects gzip)
|
|
121
|
+
const writeValue = params.compressor ? await params.compressor.decompress(rawValue) : rawValue;
|
|
122
|
+
const value = await params.serde.loadsTyped(write.type, writeValue);
|
|
123
|
+
pendingWrites.push([write.task_id, write.channel, value]);
|
|
72
124
|
}
|
|
73
|
-
//
|
|
74
|
-
const checkpointTuple = await (0, utils_1.deserializeCheckpointTuple)(item, params.serde);
|
|
125
|
+
// Deserialize the checkpoint tuple from metadata item + payload data
|
|
126
|
+
const checkpointTuple = await (0, utils_1.deserializeCheckpointTuple)(item, checkpointData, params.serde, params.compressor, params.s3Offloader);
|
|
75
127
|
// Add pending writes to the tuple
|
|
76
128
|
return {
|
|
77
129
|
...checkpointTuple,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-tuple.js","sourceRoot":"","sources":["../../../src/checkpointer/actions/get-tuple.ts"],"names":[],"mappings":";;;AAEA,
|
|
1
|
+
{"version":3,"file":"get-tuple.js","sourceRoot":"","sources":["../../../src/checkpointer/actions/get-tuple.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"put-writes.d.ts","sourceRoot":"","sources":["../../../src/checkpointer/actions/put-writes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"put-writes.d.ts","sourceRoot":"","sources":["../../../src/checkpointer/actions/put-writes.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAKjD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAU,QAAQ,qBAAqB,KAAG,OAAO,CAAC,IAAI,CAsEjF,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.putWritesAction = void 0;
|
|
4
|
+
const shared_1 = require("../../shared");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
4
6
|
const validate_configurable_1 = require("./validate-configurable");
|
|
5
7
|
const writer_1 = require("./writer");
|
|
6
|
-
const utils_1 = require("../utils");
|
|
7
|
-
const shared_1 = require("../../shared");
|
|
8
8
|
/**
|
|
9
9
|
* Save pending writes to DynamoDB
|
|
10
10
|
*
|
|
@@ -21,7 +21,18 @@ const putWritesAction = async (params) => {
|
|
|
21
21
|
(0, utils_1.validateTaskId)(params.taskId);
|
|
22
22
|
(0, utils_1.validateTTLDays)(params.ttlDays);
|
|
23
23
|
const writeItems = await Promise.all(params.writes.map(async (write, idx) => {
|
|
24
|
-
const [type,
|
|
24
|
+
const [type, rawValue] = await params.serde.dumpsTyped(write[1]);
|
|
25
|
+
// Compress after serialization if compressor is provided
|
|
26
|
+
const serializedValue = params.compressor
|
|
27
|
+
? await params.compressor.compress(rawValue)
|
|
28
|
+
: rawValue;
|
|
29
|
+
// S3 offloading for large write values
|
|
30
|
+
let s3ValueKey;
|
|
31
|
+
let storedValue = serializedValue;
|
|
32
|
+
if (params.s3Offloader && params.s3Offloader.shouldOffload(serializedValue)) {
|
|
33
|
+
s3ValueKey = await params.s3Offloader.upload(params.s3Offloader.buildKey(thread_id, checkpoint_id, `write-${idx}`), serializedValue);
|
|
34
|
+
storedValue = new Uint8Array(0); // Empty placeholder in DynamoDB
|
|
35
|
+
}
|
|
25
36
|
const item = new writer_1.Writer({
|
|
26
37
|
thread_id,
|
|
27
38
|
checkpoint_ns,
|
|
@@ -30,34 +41,28 @@ const putWritesAction = async (params) => {
|
|
|
30
41
|
idx,
|
|
31
42
|
channel: write[0],
|
|
32
43
|
type,
|
|
33
|
-
value:
|
|
44
|
+
value: storedValue,
|
|
34
45
|
});
|
|
35
46
|
const dynamoItem = item.toDynamoDBItem();
|
|
36
|
-
//
|
|
37
|
-
if (
|
|
47
|
+
// Add S3 reference if offloaded
|
|
48
|
+
if (s3ValueKey) {
|
|
49
|
+
dynamoItem.s3_value_key = s3ValueKey;
|
|
50
|
+
}
|
|
51
|
+
// Add TTL to the item that will actually be saved (ttlSeconds takes precedence)
|
|
52
|
+
if (params.ttlSeconds !== undefined) {
|
|
53
|
+
dynamoItem.ttl = (0, shared_1.calculateTTLTimestampFromSeconds)(params.ttlSeconds);
|
|
54
|
+
}
|
|
55
|
+
else if (params.ttlDays !== undefined) {
|
|
38
56
|
dynamoItem.ttl = (0, shared_1.calculateTTLTimestamp)(params.ttlDays);
|
|
39
57
|
}
|
|
40
58
|
return {
|
|
41
59
|
PutRequest: {
|
|
42
|
-
Item: dynamoItem,
|
|
60
|
+
Item: dynamoItem,
|
|
43
61
|
},
|
|
44
62
|
};
|
|
45
63
|
}));
|
|
46
|
-
// Batch writes
|
|
47
|
-
|
|
48
|
-
for (let i = 0; i < writeItems.length; i += 25) {
|
|
49
|
-
batches.push(writeItems.slice(i, i + 25));
|
|
50
|
-
}
|
|
51
|
-
// Execute batches with retry logic
|
|
52
|
-
for (const batch of batches) {
|
|
53
|
-
await (0, shared_1.withDynamoDBRetry)(async () => {
|
|
54
|
-
await params.client.batchWrite({
|
|
55
|
-
RequestItems: {
|
|
56
|
-
[params.writesTableName]: batch,
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
}
|
|
64
|
+
// Batch writes using shared utility with retry logic
|
|
65
|
+
await (0, shared_1.batchWriteAllWithRetry)(params.client, params.writesTableName, writeItems);
|
|
61
66
|
};
|
|
62
67
|
exports.putWritesAction = putWritesAction;
|
|
63
68
|
//# sourceMappingURL=put-writes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"put-writes.js","sourceRoot":"","sources":["../../../src/checkpointer/actions/put-writes.ts"],"names":[],"mappings":";;;AAAA,mEAA+D;AAC/D,qCAAkC;AAElC
|
|
1
|
+
{"version":3,"file":"put-writes.js","sourceRoot":"","sources":["../../../src/checkpointer/actions/put-writes.ts"],"names":[],"mappings":";;;AAAA,yCAIsB;AAEtB,oCAAgF;AAChF,mEAA+D;AAC/D,qCAAkC;AAElC;;;;;GAKG;AACI,MAAM,eAAe,GAAG,KAAK,EAAE,MAA6B,EAAiB,EAAE;IACpF,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,IAAA,4CAAoB,EACtE,MAAM,CAAC,MAAM,CAAC,YAAY,CAC3B,CAAC;IAEF,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,kBAAkB;IAClB,IAAA,2BAAmB,EAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAA,sBAAc,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAA,uBAAe,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEhC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjE,yDAAyD;QACzD,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU;YACvC,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC5C,CAAC,CAAC,QAAQ,CAAC;QAEb,uCAAuC;QACvC,IAAI,UAA8B,CAAC;QACnC,IAAI,WAAW,GAAe,eAAe,CAAC;QAE9C,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE,CAAC;YAC5E,UAAU,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAC1C,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,aAAc,EAAE,SAAS,GAAG,EAAE,CAAC,EACtE,eAAe,CAChB,CAAC;YACF,WAAW,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,gCAAgC;QACnE,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,eAAM,CAAC;YACtB,SAAS;YACT,aAAa;YACb,aAAa;YACb,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,GAAG;YACH,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YACjB,IAAI;YACJ,KAAK,EAAE,WAAW;SACnB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAEzC,gCAAgC;QAChC,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,YAAY,GAAG,UAAU,CAAC;QACvC,CAAC;QAED,gFAAgF;QAChF,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,UAAU,CAAC,GAAG,GAAG,IAAA,yCAAgC,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACvE,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACxC,UAAU,CAAC,GAAG,GAAG,IAAA,8BAAqB,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC;QAED,OAAO;YACL,UAAU,EAAE;gBACV,IAAI,EAAE,UAAU;aACjB;SACF,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,qDAAqD;IACrD,MAAM,IAAA,+BAAsB,EAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;AAClF,CAAC,CAAC;AAtEW,QAAA,eAAe,mBAsE1B"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { RunnableConfig } from '@langchain/core/runnables';
|
|
2
|
-
import { PutActionParams } from '../types';
|
|
2
|
+
import { type PutActionParams } from '../types';
|
|
3
3
|
/**
|
|
4
|
-
* Save a checkpoint to DynamoDB
|
|
4
|
+
* Save a checkpoint to DynamoDB as two items:
|
|
5
|
+
* 1. Metadata item (SK = checkpoint_id) — lightweight, queried by list()
|
|
6
|
+
* 2. Payload item (SK = PAYLOAD#checkpoint_id) — heavy blob, fetched only by getTuple()
|
|
7
|
+
*
|
|
8
|
+
* Both items are written atomically via transactWrite.
|
|
5
9
|
*
|
|
6
10
|
* @param params - Parameters for the put operation
|
|
7
11
|
* @returns RunnableConfig with the saved checkpoint information
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"put.d.ts","sourceRoot":"","sources":["../../../src/checkpointer/actions/put.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"put.d.ts","sourceRoot":"","sources":["../../../src/checkpointer/actions/put.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAOhE,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,UAAU,CAAC;AAIlB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,GAAU,QAAQ,eAAe,KAAG,OAAO,CAAC,cAAc,CAkH/E,CAAC"}
|