@langgraph-js/pure-graph 3.1.2 → 3.2.2
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/dist/adapter/fetch/index.js +128 -30
- package/dist/adapter/fetch/index.js.map +1 -1
- package/dist/adapter/fetch/utils.d.ts +13 -3
- package/dist/adapter/nextjs/index.js +1 -1
- package/dist/{checkpoint-1sAx_j1E.js → checkpoint-CY59Lr2q.js} +79 -36
- package/dist/checkpoint-CY59Lr2q.js.map +1 -0
- package/dist/{createEndpoint-D1nfguxg.js → createEndpoint-vMmFiMSz.js} +20 -5
- package/dist/createEndpoint-vMmFiMSz.js.map +1 -0
- package/dist/createEndpoint.d.ts +2 -1
- package/dist/index.js +2 -2
- package/dist/queue/stream_queue.d.ts +3 -1
- package/dist/{queue-Cu_nO_wt.js → queue-CUe5TDP1.js} +120 -16
- package/dist/queue-CUe5TDP1.js.map +1 -0
- package/dist/remote/index.js +1 -1
- package/dist/shallow-checkpoint-ImbLxYNR.js +466 -0
- package/dist/shallow-checkpoint-ImbLxYNR.js.map +1 -0
- package/dist/{sqlite-adapter-BKOLSdoL.js → sqlite-adapter-CJXgit1j.js} +25 -12
- package/dist/sqlite-adapter-CJXgit1j.js.map +1 -0
- package/dist/storage/index.d.ts +4 -2
- package/dist/storage/kysely/sqlite-adapter.d.ts +7 -0
- package/dist/storage/memory/queue.d.ts +6 -0
- package/dist/storage/redis/queue.d.ts +14 -1
- package/dist/storage/sqlite/shallow-checkpoint.d.ts +59 -0
- package/dist/{stream-CsqWsCjt.js → stream-jYlUzTZO.js} +199 -64
- package/dist/stream-jYlUzTZO.js.map +1 -0
- package/package.json +2 -1
- package/dist/checkpoint-1sAx_j1E.js.map +0 -1
- package/dist/createEndpoint-D1nfguxg.js.map +0 -1
- package/dist/queue-Cu_nO_wt.js.map +0 -1
- package/dist/sqlite-adapter-BKOLSdoL.js.map +0 -1
- package/dist/stream-CsqWsCjt.js.map +0 -1
|
@@ -2,9 +2,26 @@ import { sql } from 'kysely';
|
|
|
2
2
|
|
|
3
3
|
class SQLiteAdapter {
|
|
4
4
|
db;
|
|
5
|
+
pragmaPromise = null;
|
|
5
6
|
constructor(database) {
|
|
6
7
|
this.db = database;
|
|
7
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* 设置 SQLite PRAGMA 配置,解决锁问题
|
|
11
|
+
* 使用 Promise 缓存确保并发安全且只执行一次
|
|
12
|
+
*/
|
|
13
|
+
ensurePragma() {
|
|
14
|
+
if (!this.pragmaPromise) {
|
|
15
|
+
this.pragmaPromise = this.doEnsurePragma();
|
|
16
|
+
}
|
|
17
|
+
return this.pragmaPromise;
|
|
18
|
+
}
|
|
19
|
+
async doEnsurePragma() {
|
|
20
|
+
await sql`PRAGMA busy_timeout = 5000`.execute(this.db);
|
|
21
|
+
await sql`PRAGMA journal_mode = WAL`.execute(this.db);
|
|
22
|
+
await sql`PRAGMA synchronous = NORMAL`.execute(this.db);
|
|
23
|
+
await sql`PRAGMA wal_autocheckpoint = 1000`.execute(this.db);
|
|
24
|
+
}
|
|
8
25
|
dateToDb(date) {
|
|
9
26
|
return date.toISOString();
|
|
10
27
|
}
|
|
@@ -25,8 +42,12 @@ class SQLiteAdapter {
|
|
|
25
42
|
return dbValue;
|
|
26
43
|
}
|
|
27
44
|
buildJsonQuery(db, field, key, value) {
|
|
28
|
-
const
|
|
29
|
-
|
|
45
|
+
const jsonPath = `$.${JSON.stringify(key)}`;
|
|
46
|
+
if (value === null) {
|
|
47
|
+
return sql`
|
|
48
|
+
json_type(${sql.ref(field)}, ${sql.lit(jsonPath)}) = 'null'
|
|
49
|
+
`;
|
|
50
|
+
}
|
|
30
51
|
let compareValue;
|
|
31
52
|
if (typeof value === "string") {
|
|
32
53
|
compareValue = value;
|
|
@@ -34,24 +55,16 @@ class SQLiteAdapter {
|
|
|
34
55
|
compareValue = value;
|
|
35
56
|
} else if (typeof value === "boolean") {
|
|
36
57
|
compareValue = value ? 1 : 0;
|
|
37
|
-
} else if (value === null) {
|
|
38
|
-
compareValue = null;
|
|
39
58
|
} else {
|
|
40
59
|
compareValue = JSON.stringify(value);
|
|
41
60
|
}
|
|
42
|
-
if (value === null) {
|
|
43
|
-
const keyPattern = `"${key}":null`;
|
|
44
|
-
return sql`
|
|
45
|
-
json_extract(${sql.ref(field)}, ${sql.lit(jsonPath)}) IS NULL
|
|
46
|
-
AND ${sql.ref(field)} LIKE ${sql.lit(`%${keyPattern}%`)}
|
|
47
|
-
`;
|
|
48
|
-
}
|
|
49
61
|
return sql`json_extract(${sql.ref(field)}, ${sql.lit(jsonPath)}) = ${sql.lit(compareValue)}`;
|
|
50
62
|
}
|
|
51
63
|
now() {
|
|
52
64
|
return (/* @__PURE__ */ new Date()).toISOString();
|
|
53
65
|
}
|
|
54
66
|
async createTables(db) {
|
|
67
|
+
await this.ensurePragma();
|
|
55
68
|
await sql`
|
|
56
69
|
CREATE TABLE IF NOT EXISTS threads (
|
|
57
70
|
thread_id TEXT PRIMARY KEY,
|
|
@@ -87,4 +100,4 @@ class SQLiteAdapter {
|
|
|
87
100
|
}
|
|
88
101
|
|
|
89
102
|
export { SQLiteAdapter };
|
|
90
|
-
//# sourceMappingURL=sqlite-adapter-
|
|
103
|
+
//# sourceMappingURL=sqlite-adapter-CJXgit1j.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-adapter-CJXgit1j.js","sources":["../src/storage/kysely/sqlite-adapter.ts"],"sourcesContent":["import { Kysely, sql, SqlBool, Expression, SqliteDialect } from 'kysely';\nimport { DatabaseAdapter } from './adapter';\nimport { Database } from './types';\n\n/**\n * SQLite 适配器\n * - 时间类型:TEXT (ISO 8601 字符串)\n * - JSON 类型:TEXT\n * - JSON 查询:使用 json_extract 函数\n */\nexport class SQLiteAdapter implements DatabaseAdapter {\n db: Kysely<Database>;\n private pragmaPromise: Promise<void> | null = null;\n\n constructor(database: Kysely<any>) {\n this.db = database;\n }\n\n /**\n * 设置 SQLite PRAGMA 配置,解决锁问题\n * 使用 Promise 缓存确保并发安全且只执行一次\n */\n private ensurePragma(): Promise<void> {\n if (!this.pragmaPromise) {\n this.pragmaPromise = this.doEnsurePragma();\n }\n return this.pragmaPromise;\n }\n\n private async doEnsurePragma(): Promise<void> {\n // 锁等待超时 5 秒\n await sql`PRAGMA busy_timeout = 5000`.execute(this.db);\n // WAL 模式 - 读写并发\n await sql`PRAGMA journal_mode = WAL`.execute(this.db);\n // 平衡安全与性能\n await sql`PRAGMA synchronous = NORMAL`.execute(this.db);\n // 自动清理 WAL\n await sql`PRAGMA wal_autocheckpoint = 1000`.execute(this.db);\n }\n dateToDb(date: Date): string {\n // SQLite 存储为 ISO 8601 字符串\n return date.toISOString();\n }\n\n dbToDate(dbValue: any): Date {\n // SQLite 返回字符串,需要转换为 Date\n return new Date(dbValue);\n }\n\n jsonToDb(obj: any): string {\n // SQLite 存储为 JSON 字符串\n return JSON.stringify(obj);\n }\n\n dbToJson(dbValue: any): any {\n // SQLite 返回字符串,需要解析\n if (typeof dbValue === 'string') {\n try {\n return JSON.parse(dbValue);\n } catch {\n return dbValue;\n }\n }\n return dbValue;\n }\n\n buildJsonQuery(\n db: Kysely<Database>,\n field: 'metadata' | 'interrupts',\n key: string,\n value: any,\n ): Expression<SqlBool> {\n // SQLite json_extract 的行为:\n // - 字符串: 返回不带引号的文本\n // - 数字: 返回数字\n // - 布尔值: 返回 1/0\n // - null: 返回 NULL\n // 所以比较时需要根据类型处理\n\n // 构建 JSON 路径\n // 在 SQLite 中,所有键都需要用双引号括起来以确保正确解析\n // json_extract 语法: $.key 或 $.\"key-with-special\"\n const jsonPath = `$.${JSON.stringify(key)}`;\n\n // 构建 NULL 处理条件\n // 注意:SQLite 中 json_extract 对键不存在和值为 null 都返回 NULL\n // 使用 json_type 函数区分:\n // - 键不存在:json_type 返回 NULL\n // - 值为 null:json_type 返回 'null' 字符串\n if (value === null) {\n return sql<boolean>`\n json_type(${sql.ref(field)}, ${sql.lit(jsonPath)}) = 'null'\n `;\n }\n\n // 处理其他类型的值\n let compareValue: any;\n if (typeof value === 'string') {\n // 字符串: json_extract 返回不带引号的字符串,直接比较\n compareValue = value;\n } else if (typeof value === 'number') {\n // 数字: json_extract 返回数字\n compareValue = value;\n } else if (typeof value === 'boolean') {\n // 布尔值: json_extract 返回 1/0\n compareValue = value ? 1 : 0;\n } else {\n // 其他类型(对象、数组): 使用 JSON 字符串\n compareValue = JSON.stringify(value);\n }\n\n // 构建普通比较条件\n return sql<boolean>`json_extract(${sql.ref(field)}, ${sql.lit(jsonPath)}) = ${sql.lit(compareValue)}`;\n }\n\n now(): string {\n return new Date().toISOString();\n }\n\n async createTables(db: Kysely<Database>): Promise<void> {\n // 先设置 PRAGMA\n await this.ensurePragma();\n\n // 创建 threads 表\n await sql`\n CREATE TABLE IF NOT EXISTS threads (\n thread_id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}',\n status TEXT NOT NULL DEFAULT 'idle',\n \"values\" TEXT,\n interrupts TEXT NOT NULL DEFAULT '{}'\n )\n `.execute(db);\n\n // 创建 runs 表\n await sql`\n CREATE TABLE IF NOT EXISTS runs (\n run_id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n assistant_id TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n metadata TEXT NOT NULL DEFAULT '{}',\n multitask_strategy TEXT NOT NULL DEFAULT 'reject',\n FOREIGN KEY (thread_id) REFERENCES threads(thread_id) ON DELETE CASCADE\n )\n `.execute(db);\n }\n\n async createIndexes(db: Kysely<Database>): Promise<void> {\n await sql`CREATE INDEX IF NOT EXISTS idx_threads_status ON threads(status)`.execute(db);\n await sql`CREATE INDEX IF NOT EXISTS idx_threads_created_at ON threads(created_at)`.execute(db);\n await sql`CREATE INDEX IF NOT EXISTS idx_threads_updated_at ON threads(updated_at)`.execute(db);\n await sql`CREATE INDEX IF NOT EXISTS idx_runs_thread_id ON runs(thread_id)`.execute(db);\n await sql`CREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status)`.execute(db);\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -3,11 +3,13 @@ import { KyselyThreadsManager } from './kysely/threads';
|
|
|
3
3
|
import { ShallowMemorySaver } from './memory/shallow-memory';
|
|
4
4
|
import { MemoryThreadsManager } from './memory/threads';
|
|
5
5
|
import type { SqliteSaver as SqliteSaverType } from './sqlite/checkpoint';
|
|
6
|
+
import type { SqliteShallowSaver as SqliteShallowSaverType } from './sqlite/shallow-checkpoint';
|
|
6
7
|
import type { PostgresSaver } from '@langchain/langgraph-checkpoint-postgres';
|
|
7
8
|
export { ShallowMemorySaver } from './memory/shallow-memory';
|
|
8
9
|
export { MemorySaver } from './memory/checkpoint';
|
|
9
|
-
export
|
|
10
|
+
export { SqliteShallowSaver } from './sqlite/shallow-checkpoint';
|
|
11
|
+
export declare const createCheckPointer: () => Promise<ShallowMemorySaver | SqliteSaverType | SqliteShallowSaverType | PostgresSaver | import("@langchain/langgraph-checkpoint-redis").RedisSaver | import("@langchain/langgraph-checkpoint-redis/shallow").ShallowRedisSaver>;
|
|
10
12
|
export declare const createMessageQueue: () => Promise<StreamQueueManager<BaseStreamQueueInterface>>;
|
|
11
13
|
export declare const createThreadManager: (config: {
|
|
12
|
-
checkpointer?: SqliteSaverType | PostgresSaver;
|
|
14
|
+
checkpointer?: SqliteSaverType | SqliteShallowSaverType | PostgresSaver;
|
|
13
15
|
}) => Promise<import("./kysely").RemoteKyselyThreadsManager<unknown> | KyselyThreadsManager<unknown> | MemoryThreadsManager<unknown>>;
|
|
@@ -9,7 +9,14 @@ import { Database } from './types';
|
|
|
9
9
|
*/
|
|
10
10
|
export declare class SQLiteAdapter implements DatabaseAdapter {
|
|
11
11
|
db: Kysely<Database>;
|
|
12
|
+
private pragmaPromise;
|
|
12
13
|
constructor(database: Kysely<any>);
|
|
14
|
+
/**
|
|
15
|
+
* 设置 SQLite PRAGMA 配置,解决锁问题
|
|
16
|
+
* 使用 Promise 缓存确保并发安全且只执行一次
|
|
17
|
+
*/
|
|
18
|
+
private ensurePragma;
|
|
19
|
+
private doEnsurePragma;
|
|
13
20
|
dateToDb(date: Date): string;
|
|
14
21
|
dbToDate(dbValue: any): Date;
|
|
15
22
|
jsonToDb(obj: any): string;
|
|
@@ -4,6 +4,8 @@ import { BaseStreamQueueInterface } from '../../queue/stream_queue.js';
|
|
|
4
4
|
/** 内存实现的消息队列,用于存储消息 */
|
|
5
5
|
export declare class MemoryStreamQueue extends BaseStreamQueue implements BaseStreamQueueInterface {
|
|
6
6
|
private data;
|
|
7
|
+
private activeGenerators;
|
|
8
|
+
private isDestroyed;
|
|
7
9
|
push(item: EventMessage): Promise<void>;
|
|
8
10
|
onDataChange(listener: (data: EventMessage) => void): () => void;
|
|
9
11
|
/**
|
|
@@ -15,4 +17,8 @@ export declare class MemoryStreamQueue extends BaseStreamQueue implements BaseSt
|
|
|
15
17
|
cancelSignal: AbortController;
|
|
16
18
|
cancel(): Promise<void>;
|
|
17
19
|
copyToQueue(toId: string, ttl?: number): Promise<MemoryStreamQueue>;
|
|
20
|
+
/**
|
|
21
|
+
* 销毁队列,释放所有资源
|
|
22
|
+
*/
|
|
23
|
+
destroy(): Promise<void>;
|
|
18
24
|
}
|
|
@@ -16,7 +16,16 @@ export declare class RedisStreamQueue extends BaseStreamQueue implements BaseStr
|
|
|
16
16
|
cancelSignal: AbortController;
|
|
17
17
|
private lastStreamId;
|
|
18
18
|
private pollInterval;
|
|
19
|
+
private connectionReady;
|
|
19
20
|
constructor(id: string, compressMessages?: boolean, ttl?: number);
|
|
21
|
+
/**
|
|
22
|
+
* 初始化 Redis 连接(使用共享连接池)
|
|
23
|
+
*/
|
|
24
|
+
private initConnection;
|
|
25
|
+
/**
|
|
26
|
+
* 确保连接已建立
|
|
27
|
+
*/
|
|
28
|
+
private ensureConnected;
|
|
20
29
|
/**
|
|
21
30
|
* 推送消息到 Redis Stream 和 List
|
|
22
31
|
* - Stream: 用于实时推送(集群友好)
|
|
@@ -34,7 +43,11 @@ export declare class RedisStreamQueue extends BaseStreamQueue implements BaseStr
|
|
|
34
43
|
/**
|
|
35
44
|
* 清空队列
|
|
36
45
|
*/
|
|
37
|
-
clear(): void
|
|
46
|
+
clear(): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* 销毁队列实例,释放 Redis 连接引用
|
|
49
|
+
*/
|
|
50
|
+
destroy(): Promise<void>;
|
|
38
51
|
/**
|
|
39
52
|
* 取消操作
|
|
40
53
|
*/
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Dialect, Kysely } from 'kysely';
|
|
2
|
+
import type { RunnableConfig } from '@langchain/core/runnables';
|
|
3
|
+
import { BaseCheckpointSaver, type Checkpoint, type CheckpointListOptions, type CheckpointTuple, type SerializerProtocol, type PendingWrite, type CheckpointMetadata } from '@langchain/langgraph-checkpoint';
|
|
4
|
+
interface ShallowCheckpointsTable {
|
|
5
|
+
thread_id: string;
|
|
6
|
+
checkpoint_ns: string;
|
|
7
|
+
checkpoint_id: string;
|
|
8
|
+
parent_checkpoint_id: string | null;
|
|
9
|
+
type: string | null;
|
|
10
|
+
checkpoint: Uint8Array;
|
|
11
|
+
metadata: Uint8Array;
|
|
12
|
+
checkpoint_ts: number;
|
|
13
|
+
}
|
|
14
|
+
interface WritesTable {
|
|
15
|
+
thread_id: string;
|
|
16
|
+
checkpoint_ns: string;
|
|
17
|
+
checkpoint_id: string;
|
|
18
|
+
task_id: string;
|
|
19
|
+
idx: number;
|
|
20
|
+
channel: string;
|
|
21
|
+
type: string | null;
|
|
22
|
+
value: Uint8Array | null;
|
|
23
|
+
}
|
|
24
|
+
interface ShallowCheckpointDatabase {
|
|
25
|
+
shallow_checkpoints: ShallowCheckpointsTable;
|
|
26
|
+
writes: WritesTable;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* SqliteShallowSaver - SQLite 浅层检查点存储器
|
|
30
|
+
*
|
|
31
|
+
* 特性:
|
|
32
|
+
* - 每个 thread_id + checkpoint_ns 组合只保留最新的 checkpoint
|
|
33
|
+
* - 新 checkpoint 写入时自动清理旧 checkpoint 的 writes
|
|
34
|
+
* - 使用 checkpoint_ts 时间戳排序
|
|
35
|
+
* - 大幅减少存储数据量
|
|
36
|
+
*/
|
|
37
|
+
export declare class SqliteShallowSaver extends BaseCheckpointSaver {
|
|
38
|
+
db: Kysely<ShallowCheckpointDatabase>;
|
|
39
|
+
protected isSetup: boolean;
|
|
40
|
+
constructor(dialect: Dialect, serde?: SerializerProtocol);
|
|
41
|
+
static fromConnStringAsync(connStringOrLocalPath: string): Promise<SqliteShallowSaver>;
|
|
42
|
+
protected setup(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* 获取 checkpoint(便捷方法)
|
|
45
|
+
*/
|
|
46
|
+
get(config: RunnableConfig): Promise<Checkpoint | undefined>;
|
|
47
|
+
getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined>;
|
|
48
|
+
list(config: RunnableConfig, options?: CheckpointListOptions): AsyncGenerator<CheckpointTuple>;
|
|
49
|
+
/**
|
|
50
|
+
* Check metadata filter matches (with deep comparison support)
|
|
51
|
+
* Matches ShallowMemorySaver behavior
|
|
52
|
+
*/
|
|
53
|
+
private _checkMetadataFilterMatch;
|
|
54
|
+
put(config: RunnableConfig, checkpoint: Checkpoint, metadata: CheckpointMetadata, _newVersions?: Record<string, string | number>): Promise<RunnableConfig>;
|
|
55
|
+
putWrites(config: RunnableConfig, writes: PendingWrite[], taskId: string): Promise<void>;
|
|
56
|
+
deleteThread(threadId: string): Promise<void>;
|
|
57
|
+
protected migratePendingSends(checkpoint: Checkpoint, threadId: string, parentCheckpointId: string): Promise<void>;
|
|
58
|
+
}
|
|
59
|
+
export {};
|