@langgraph-js/pure-graph 2.10.0 → 3.0.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/dist/adapter/fetch/assistants.d.ts +42 -0
- package/dist/adapter/fetch/endpoint.d.ts +25 -0
- package/dist/adapter/fetch/index.d.ts +5 -3
- package/dist/adapter/fetch/index.js +858 -25
- package/dist/adapter/fetch/index.js.map +1 -1
- package/dist/adapter/fetch/runs-extended.d.ts +21 -0
- package/dist/adapter/fetch/runs-stateless.d.ts +28 -0
- package/dist/adapter/fetch/runs.d.ts +0 -4
- package/dist/adapter/fetch/threads.d.ts +36 -0
- package/dist/adapter/nextjs/index.js +1 -1
- package/dist/adapter/zod.d.ts +292 -1
- package/dist/agents/ask_subagents.d.ts +1 -1
- package/dist/createEndpoint-Bz70ehjn.js +208 -0
- package/dist/createEndpoint-Bz70ehjn.js.map +1 -0
- package/dist/createEndpoint.d.ts +25 -0
- package/dist/index.js +2 -2
- package/dist/queue/stream_queue.d.ts +2 -2
- package/dist/queue-Bfg-8ehP.js +153 -0
- package/dist/queue-Bfg-8ehP.js.map +1 -0
- package/dist/remote/index.js +158 -0
- package/dist/remote/index.js.map +1 -0
- package/dist/remote-threads-CrG03ZS7.js +255 -0
- package/dist/remote-threads-CrG03ZS7.js.map +1 -0
- package/dist/{sqlite-adapter-5PeLHaxe.js → sqlite-adapter-Bbonr5S5.js} +8 -4
- package/dist/sqlite-adapter-Bbonr5S5.js.map +1 -0
- package/dist/storage/index.d.ts +1 -1
- package/dist/storage/kysely/index.d.ts +1 -0
- package/dist/storage/kysely/remote-threads.d.ts +124 -0
- package/dist/storage/kysely/threads.d.ts +26 -2
- package/dist/storage/kysely/types.d.ts +10 -0
- package/dist/storage/memory/threads.d.ts +27 -1
- package/dist/storage/redis/queue.d.ts +14 -11
- package/dist/storage/remote/fetch.d.ts +20 -0
- package/dist/storage/remote/remote-server.d.ts +17 -0
- package/dist/storage/remote/server.d.ts +11 -0
- package/dist/storage/remote/types.d.ts +121 -0
- package/dist/{stream-D0YD2Pjq.js → stream-Crp1K8nB.js} +503 -79
- package/dist/stream-Crp1K8nB.js.map +1 -0
- package/dist/threads/index.d.ts +25 -1
- package/dist/types.d.ts +53 -1
- package/package.json +10 -4
- package/dist/createEndpoint-CN_RHDEd.js +0 -122
- package/dist/createEndpoint-CN_RHDEd.js.map +0 -1
- package/dist/queue-D6tEGCGs.js +0 -146
- package/dist/queue-D6tEGCGs.js.map +0 -1
- package/dist/sqlite-adapter-5PeLHaxe.js.map +0 -1
- package/dist/stream-D0YD2Pjq.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-threads-CrG03ZS7.js","sources":["../src/storage/remote/types.ts","../src/storage/remote/fetch.ts","../src/storage/kysely/remote-threads.ts"],"sourcesContent":["/**\n * Remote PostgreSQL Adapter 类型定义\n * 定义 API 请求/响应格式和错误类型\n */\n\nimport { Metadata, OnConflictBehavior, Run, Thread, ThreadStatus, Command } from '@langgraph-js/sdk';\nimport { RunStatus, SortOrder, ThreadSortBy } from '../../types';\n\n/**\n * API 响应通用格式\n */\nexport interface RemoteResponse<T = any> {\n success: boolean;\n data?: T;\n error?: {\n code: string;\n message: string;\n };\n}\n\n/**\n * 错误码枚举\n */\nexport enum RemoteErrorCode {\n // 网络错误\n NETWORK_ERROR = 'NETWORK_ERROR',\n CONNECTION_TIMEOUT = 'CONNECTION_TIMEOUT',\n\n // 服务器错误\n INTERNAL_ERROR = 'INTERNAL_ERROR',\n\n // 业务错误\n THREAD_NOT_FOUND = 'THREAD_NOT_FOUND',\n THREAD_BUSY = 'THREAD_BUSY',\n RUN_NOT_FOUND = 'RUN_NOT_FOUND',\n GRAPH_NOT_FOUND = 'GRAPH_NOT_FOUND',\n INVALID_REQUEST = 'INVALID_REQUEST',\n}\n\n/**\n * 远程 API 错误类\n */\nexport class RemoteApiError extends Error {\n constructor(\n public code: string,\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = 'RemoteApiError';\n }\n}\n\n/**\n * Setup API 响应\n */\nexport interface SetupResponse {\n message: string;\n}\n\n/**\n * Create Thread API 请求\n */\nexport interface CreateThreadRequest {\n metadata?: Metadata;\n threadId?: string;\n ifExists?: OnConflictBehavior;\n graphId?: string;\n supersteps?: Array<{ updates: Array<{ values: unknown; command?: Command; asNode: string }> }>;\n}\n\n/**\n * Search Threads API 请求\n */\nexport interface SearchThreadsRequest {\n ids?: string[];\n metadata?: Metadata;\n limit?: number;\n offset?: number;\n status?: ThreadStatus;\n sortBy?: ThreadSortBy;\n sortOrder?: SortOrder;\n values?: unknown;\n select?: Array<'thread_id' | 'created_at' | 'updated_at' | 'metadata' | 'config' | 'context' | 'status' | 'values' | 'interrupts'>;\n /**\n * @deprecated Use `select` parameter instead for fine-grained field control\n */\n withoutDetails?: boolean;\n}\n\n/**\n * Update Thread API 请求\n */\nexport interface UpdateThreadRequest {\n metadata?: Metadata;\n status?: ThreadStatus;\n values?: any;\n interrupts?: Record<string, any>;\n}\n\n/**\n * Update State API 请求\n */\nexport interface UpdateStateRequest {\n values?: any;\n}\n\n/**\n * Update State API 响应\n */\nexport interface UpdateStateResponse {\n configurable: Record<string, any>;\n}\n\n/**\n * Create Run API 请求\n */\nexport interface CreateRunRequest {\n metadata?: Metadata;\n}\n\n/**\n * List Runs API 请求\n */\nexport interface ListRunsRequest {\n limit?: number;\n offset?: number;\n status?: RunStatus;\n}\n\n/**\n * Update Run API 请求\n */\nexport interface UpdateRunRequest {\n status?: RunStatus;\n metadata?: Metadata;\n multitask_strategy?: 'reject' | 'interrupt' | 'rollback';\n}\n","/**\n * Remote PostgreSQL Adapter - 简化的 Fetch 工具函数\n */\n\nimport { RemoteResponse } from './types';\nimport { RemoteApiError, RemoteErrorCode } from './types';\n\n/**\n * 发起 HTTP 请求的简化函数\n */\nasync function request<T>(\n url: string,\n method: string,\n options?: {\n query?: Record<string, string | number | boolean>;\n body?: any;\n },\n): Promise<RemoteResponse<T>> {\n try {\n // 添加查询参数\n let requestUrl = url;\n if (options?.query) {\n const searchParams = new URLSearchParams();\n Object.entries(options.query).forEach(([key, value]) => {\n searchParams.append(key, String(value));\n });\n requestUrl += `?${searchParams.toString()}`;\n }\n\n // 发起请求\n const response = await fetch(requestUrl, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n },\n body: options?.body ? JSON.stringify(options.body) : undefined,\n });\n\n // 解析响应\n const data: RemoteResponse<T> = (await response.json()) as any;\n\n // 检查响应状态\n if (!response.ok || !data.success) {\n throw new RemoteApiError(\n data.error?.code || RemoteErrorCode.INTERNAL_ERROR,\n data.error?.message || 'Unknown error',\n response.status,\n );\n }\n\n return data;\n } catch (error) {\n // 如果是 RemoteApiError,直接抛出\n if (error instanceof RemoteApiError) {\n throw error;\n }\n\n // 网络错误转换为 RemoteApiError\n throw new RemoteApiError(\n RemoteErrorCode.NETWORK_ERROR,\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n}\n\n/**\n * GET 请求\n */\nexport async function remoteGet<T>(\n url: string,\n query?: Record<string, string | number | boolean>,\n): Promise<RemoteResponse<T>> {\n return request<T>(url, 'GET', { query });\n}\n\n/**\n * POST 请求\n */\nexport async function remotePost<T>(\n url: string,\n body?: any,\n query?: Record<string, string | number | boolean>,\n): Promise<RemoteResponse<T>> {\n return request<T>(url, 'POST', { body, query });\n}\n\n/**\n * PUT 请求\n */\nexport async function remotePut<T>(\n url: string,\n body?: any,\n query?: Record<string, string | number | boolean>,\n): Promise<RemoteResponse<T>> {\n return request<T>(url, 'PUT', { body, query });\n}\n\n/**\n * DELETE 请求\n */\nexport async function remoteDelete<T>(\n url: string,\n query?: Record<string, string | number | boolean>,\n): Promise<RemoteResponse<T>> {\n return request<T>(url, 'DELETE', { query });\n}\n","/**\n * Remote Kysely Threads Manager\n * 通过 HTTP/REST API 与远程 PostgreSQL 服务器通信\n */\n\nimport { BaseThreadsManager } from '../../threads';\nimport { Metadata, OnConflictBehavior, Run, Thread, ThreadState } from '@langgraph-js/sdk';\nimport { RunStatus, SortOrder, ThreadSortBy } from '../../types';\nimport { remoteGet, remotePost, remotePut, remoteDelete } from '../remote/fetch';\nimport { RemoteApiError, RemoteErrorCode } from '../remote/types';\n\n/**\n * 远程 Kysely Threads Manager\n */\nexport class RemoteKyselyThreadsManager<ValuesType = unknown> implements BaseThreadsManager<ValuesType> {\n constructor(private serverUrl: string, private httpClient?: typeof fetch) {\n // 确保服务器 URL 没有尾部斜杠\n this.serverUrl = serverUrl.replace(/\\/$/, '');\n this.httpClient = httpClient || fetch;\n }\n\n /**\n * 初始化数据库\n */\n async setup(): Promise<void> {\n await remotePost(`${this.serverUrl}/setup`);\n }\n\n /**\n * 创建线程\n */\n async create(payload?: {\n metadata?: Metadata;\n threadId?: string;\n ifExists?: OnConflictBehavior;\n graphId?: string;\n supersteps?: Array<{ updates: Array<{ values: unknown; command?: any; asNode: string }> }>;\n }): Promise<Thread<ValuesType>> {\n const response = await remotePost<Thread<ValuesType>>(`${this.serverUrl}/threads`, payload);\n return response.data as Thread<ValuesType>;\n }\n\n /**\n * 搜索线程\n */\n async search(query?: {\n ids?: string[];\n metadata?: Metadata;\n limit?: number;\n offset?: number;\n status?: any;\n sortBy?: ThreadSortBy;\n sortOrder?: SortOrder;\n values?: ValuesType;\n select?: Array<\n | 'thread_id'\n | 'created_at'\n | 'updated_at'\n | 'metadata'\n | 'config'\n | 'context'\n | 'status'\n | 'values'\n | 'interrupts'\n >;\n /**\n * @deprecated Use `select` parameter instead for fine-grained field control\n */\n withoutDetails?: boolean;\n }): Promise<Thread<ValuesType>[]> {\n const params: Record<string, string | number | boolean> = {};\n\n if (query?.ids !== undefined && query.ids.length > 0) {\n params.ids = JSON.stringify(query.ids);\n }\n if (query?.metadata !== undefined) {\n params.metadata = JSON.stringify(query.metadata);\n }\n if (query?.limit !== undefined) {\n params.limit = query.limit;\n }\n if (query?.offset !== undefined) {\n params.offset = query.offset;\n }\n if (query?.status !== undefined) {\n params.status = query.status;\n }\n if (query?.sortBy !== undefined) {\n params.sortBy = query.sortBy;\n }\n if (query?.sortOrder !== undefined) {\n params.sortOrder = query.sortOrder;\n }\n if (query?.values !== undefined) {\n params.values = JSON.stringify(query.values);\n }\n if (query?.select !== undefined) {\n params.select = JSON.stringify(query.select);\n }\n if (query?.withoutDetails !== undefined) {\n params.withoutDetails = query.withoutDetails;\n }\n\n const response = await remoteGet<Thread<ValuesType>[]>(`${this.serverUrl}/threads`, params);\n return response.data as Thread<ValuesType>[];\n }\n\n /**\n * 获取线程\n */\n async get(threadId: string): Promise<Thread<ValuesType>> {\n const response = await remoteGet<Thread<ValuesType>>(`${this.serverUrl}/threads/${threadId}`);\n return response.data as Thread<ValuesType>;\n }\n\n /**\n * 更新线程\n */\n async set(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<void> {\n await remotePut(`${this.serverUrl}/threads/${threadId}`, thread);\n }\n\n /**\n * 删除线程\n */\n async delete(threadId: string): Promise<void> {\n await remoteDelete(`${this.serverUrl}/threads/${threadId}`);\n }\n\n /**\n * 更新状态\n */\n async updateState(\n threadId: string,\n thread: Partial<Thread<ValuesType>>,\n ): Promise<{ configurable: Record<string, any> }> {\n const response = await remotePost<{ configurable: Record<string, any> }>(\n `${this.serverUrl}/threads/${threadId}/state`,\n thread,\n );\n return response.data as { configurable: Record<string, any> };\n }\n\n /**\n * 创建运行\n */\n async createRun(threadId: string, assistantId: string, payload?: { metadata?: Metadata }): Promise<Run> {\n const response = await remotePost<Run>(`${this.serverUrl}/threads/${threadId}/runs`, payload || {}, {\n assistantId,\n });\n return response.data as Run;\n }\n\n /**\n * 列出运行\n */\n async listRuns(\n threadId: string,\n options?: { limit?: number; offset?: number; status?: RunStatus },\n ): Promise<Run[]> {\n const params: Record<string, string | number> = {};\n\n if (options?.limit !== undefined) {\n params.limit = options.limit;\n }\n if (options?.offset !== undefined) {\n params.offset = options.offset;\n }\n if (options?.status !== undefined) {\n params.status = options.status;\n }\n\n const response = await remoteGet<Run[]>(`${this.serverUrl}/threads/${threadId}/runs`, params);\n return response.data as Run[];\n }\n\n /**\n * 更新运行\n */\n async updateRun(runId: string, run: Partial<Run>): Promise<void> {\n await remotePut(`${this.serverUrl}/runs/${runId}`, run);\n }\n\n // New methods for Threads API\n\n /**\n * 计算线程数量\n */\n async count(query?: { ids?: string[]; metadata?: Metadata; status?: any; values?: ValuesType }): Promise<number> {\n const params: Record<string, string> = {};\n\n if (query?.ids !== undefined && query.ids.length > 0) {\n params.ids = JSON.stringify(query.ids);\n }\n if (query?.metadata !== undefined) {\n params.metadata = JSON.stringify(query.metadata);\n }\n if (query?.status !== undefined) {\n params.status = query.status;\n }\n if (query?.values !== undefined) {\n params.values = JSON.stringify(query.values);\n }\n\n const response = await remoteGet<number>(`${this.serverUrl}/threads/count`, params);\n return response.data as number;\n }\n\n /**\n * 更新线程元数据\n */\n async patch(\n threadId: string,\n updates: Partial<Omit<Thread<ValuesType>, 'thread_id' | 'created_at' | 'updated_at'>>,\n ): Promise<Thread<ValuesType>> {\n const response = await remotePost<Thread<ValuesType>>(`${this.serverUrl}/threads/${threadId}`, updates);\n return response.data as Thread<ValuesType>;\n }\n\n /**\n * 获取线程状态\n */\n async getState(threadId: string, options?: { subgraphs?: boolean; checkpointId?: string }): Promise<ThreadState> {\n const params: Record<string, boolean | string> = {};\n\n if (options?.subgraphs !== undefined) {\n params.subgraphs = options.subgraphs;\n }\n if (options?.checkpointId !== undefined) {\n params.checkpointId = options.checkpointId;\n }\n\n const response = await remotePost<ThreadState>(`${this.serverUrl}/threads/${threadId}/state`, params);\n return response.data as ThreadState;\n }\n\n /**\n * 获取线程历史\n */\n async getStateHistory(\n threadId: string,\n options?: {\n limit?: number;\n before?: string;\n filter?: { source?: string; step?: number };\n },\n ): Promise<ThreadState[]> {\n const params: Record<string, number | string> = {};\n\n if (options?.limit !== undefined) {\n params.limit = options.limit;\n }\n if (options?.before !== undefined) {\n params.before = options.before;\n }\n\n const response = await remotePost<ThreadState[]>(`${this.serverUrl}/threads/${threadId}/history`, params);\n return response.data as ThreadState[];\n }\n\n /**\n * 复制线程\n */\n async copy(threadId: string): Promise<Thread<ValuesType>> {\n const response = await remotePost<Thread<ValuesType>>(`${this.serverUrl}/threads/${threadId}/copy`);\n return response.data as Thread<ValuesType>;\n }\n}\n"],"names":["RemoteErrorCode"],"mappings":"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"}
|
|
@@ -25,9 +25,13 @@ class SQLiteAdapter {
|
|
|
25
25
|
return dbValue;
|
|
26
26
|
}
|
|
27
27
|
buildJsonQuery(db, field, key, value) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
const jsonString = JSON.stringify(value);
|
|
29
|
+
return sql`(
|
|
30
|
+
json_extract(${sql.ref(field)}, ${sql.lit("$." + key)}) = ${sql.lit(jsonString)}
|
|
31
|
+
) OR (
|
|
32
|
+
json_extract(${sql.ref(field)}, ${sql.lit("$." + key)}) IS NULL
|
|
33
|
+
AND ${sql.lit(jsonString)} IS NULL
|
|
34
|
+
)`;
|
|
31
35
|
}
|
|
32
36
|
now() {
|
|
33
37
|
return (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -68,4 +72,4 @@ class SQLiteAdapter {
|
|
|
68
72
|
}
|
|
69
73
|
|
|
70
74
|
export { SQLiteAdapter };
|
|
71
|
-
//# sourceMappingURL=sqlite-adapter-
|
|
75
|
+
//# sourceMappingURL=sqlite-adapter-Bbonr5S5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-adapter-Bbonr5S5.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 constructor(database: Kysely<any>) {\n this.db = database;\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 const jsonString = JSON.stringify(value);\n \n // 改进的 JSON 查询,添加 NULL 值处理\n // json_extract 会返回 NULL 当键不存在或值为 NULL\n return sql<boolean>`(\n json_extract(${sql.ref(field)}, ${sql.lit('$.' + key)}) = ${sql.lit(jsonString)}\n ) OR (\n json_extract(${sql.ref(field)}, ${sql.lit('$.' + key)}) IS NULL\n AND ${sql.lit(jsonString)} IS NULL\n )`;\n }\n\n now(): string {\n return new Date().toISOString();\n }\n\n async createTables(db: Kysely<Database>): Promise<void> {\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":";;AAUO,MAAM,aAAA,CAAyC;AAAA,EAClD,EAAA;AAAA,EACA,YAAY,QAAA,EAAuB;AAC/B,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA;AAAA,EACd;AAAA,EACA,SAAS,IAAA,EAAoB;AAEzB,IAAA,OAAO,KAAK,WAAA,EAAY;AAAA,EAC5B;AAAA,EAEA,SAAS,OAAA,EAAoB;AAEzB,IAAA,OAAO,IAAI,KAAK,OAAO,CAAA;AAAA,EAC3B;AAAA,EAEA,SAAS,GAAA,EAAkB;AAEvB,IAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,EAC7B;AAAA,EAEA,SAAS,OAAA,EAAmB;AAExB,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC7B,MAAA,IAAI;AACA,QAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,MAC7B,CAAA,CAAA,MAAQ;AACJ,QAAA,OAAO,OAAA;AAAA,MACX;AAAA,IACJ;AACA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,cAAA,CACI,EAAA,EACA,KAAA,EACA,GAAA,EACA,KAAA,EACmB;AACnB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAIvC,IAAA,OAAO,GAAA,CAAA;AAAA,yBAAA,EACY,GAAA,CAAI,GAAA,CAAI,KAAK,CAAC,KAAK,GAAA,CAAI,GAAA,CAAI,IAAA,GAAO,GAAG,CAAC,CAAA,IAAA,EAAO,GAAA,CAAI,GAAA,CAAI,UAAU,CAAC;AAAA;AAAA,yBAAA,EAEhE,GAAA,CAAI,IAAI,KAAK,CAAC,KAAK,GAAA,CAAI,GAAA,CAAI,IAAA,GAAO,GAAG,CAAC,CAAA;AAAA,gBAAA,EAC/C,GAAA,CAAI,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,SAAA,CAAA;AAAA,EAEjC;AAAA,EAEA,GAAA,GAAc;AACV,IAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,EAClC;AAAA,EAEA,MAAM,aAAa,EAAA,EAAqC;AAEpD,IAAA,MAAM,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,CAUJ,QAAQ,EAAE,CAAA;AAGZ,IAAA,MAAM,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,CAYJ,QAAQ,EAAE,CAAA;AAAA,EAChB;AAAA,EAEA,MAAM,cAAc,EAAA,EAAqC;AACrD,IAAA,MAAM,GAAA,CAAA,gEAAA,CAAA,CAAsE,QAAQ,EAAE,CAAA;AACtF,IAAA,MAAM,GAAA,CAAA,wEAAA,CAAA,CAA8E,QAAQ,EAAE,CAAA;AAC9F,IAAA,MAAM,GAAA,CAAA,wEAAA,CAAA,CAA8E,QAAQ,EAAE,CAAA;AAC9F,IAAA,MAAM,GAAA,CAAA,gEAAA,CAAA,CAAsE,QAAQ,EAAE,CAAA;AACtF,IAAA,MAAM,GAAA,CAAA,0DAAA,CAAA,CAAgE,QAAQ,EAAE,CAAA;AAAA,EACpF;AACJ;;;;"}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -8,4 +8,4 @@ export declare const createCheckPointer: () => Promise<SqliteSaverType | Postgre
|
|
|
8
8
|
export declare const createMessageQueue: () => Promise<StreamQueueManager<BaseStreamQueueInterface>>;
|
|
9
9
|
export declare const createThreadManager: (config: {
|
|
10
10
|
checkpointer?: SqliteSaverType | PostgresSaver;
|
|
11
|
-
}) => Promise<KyselyThreadsManager<unknown> | MemoryThreadsManager<unknown>>;
|
|
11
|
+
}) => Promise<import("./kysely").RemoteKyselyThreadsManager<unknown> | KyselyThreadsManager<unknown> | MemoryThreadsManager<unknown>>;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote Kysely Threads Manager
|
|
3
|
+
* 通过 HTTP/REST API 与远程 PostgreSQL 服务器通信
|
|
4
|
+
*/
|
|
5
|
+
import { BaseThreadsManager } from '../../threads';
|
|
6
|
+
import { Metadata, OnConflictBehavior, Run, Thread, ThreadState } from '@langgraph-js/sdk';
|
|
7
|
+
import { RunStatus, SortOrder, ThreadSortBy } from '../../types';
|
|
8
|
+
/**
|
|
9
|
+
* 远程 Kysely Threads Manager
|
|
10
|
+
*/
|
|
11
|
+
export declare class RemoteKyselyThreadsManager<ValuesType = unknown> implements BaseThreadsManager<ValuesType> {
|
|
12
|
+
private serverUrl;
|
|
13
|
+
private httpClient?;
|
|
14
|
+
constructor(serverUrl: string, httpClient?: typeof fetch | undefined);
|
|
15
|
+
/**
|
|
16
|
+
* 初始化数据库
|
|
17
|
+
*/
|
|
18
|
+
setup(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* 创建线程
|
|
21
|
+
*/
|
|
22
|
+
create(payload?: {
|
|
23
|
+
metadata?: Metadata;
|
|
24
|
+
threadId?: string;
|
|
25
|
+
ifExists?: OnConflictBehavior;
|
|
26
|
+
graphId?: string;
|
|
27
|
+
supersteps?: Array<{
|
|
28
|
+
updates: Array<{
|
|
29
|
+
values: unknown;
|
|
30
|
+
command?: any;
|
|
31
|
+
asNode: string;
|
|
32
|
+
}>;
|
|
33
|
+
}>;
|
|
34
|
+
}): Promise<Thread<ValuesType>>;
|
|
35
|
+
/**
|
|
36
|
+
* 搜索线程
|
|
37
|
+
*/
|
|
38
|
+
search(query?: {
|
|
39
|
+
ids?: string[];
|
|
40
|
+
metadata?: Metadata;
|
|
41
|
+
limit?: number;
|
|
42
|
+
offset?: number;
|
|
43
|
+
status?: any;
|
|
44
|
+
sortBy?: ThreadSortBy;
|
|
45
|
+
sortOrder?: SortOrder;
|
|
46
|
+
values?: ValuesType;
|
|
47
|
+
select?: Array<'thread_id' | 'created_at' | 'updated_at' | 'metadata' | 'config' | 'context' | 'status' | 'values' | 'interrupts'>;
|
|
48
|
+
/**
|
|
49
|
+
* @deprecated Use `select` parameter instead for fine-grained field control
|
|
50
|
+
*/
|
|
51
|
+
withoutDetails?: boolean;
|
|
52
|
+
}): Promise<Thread<ValuesType>[]>;
|
|
53
|
+
/**
|
|
54
|
+
* 获取线程
|
|
55
|
+
*/
|
|
56
|
+
get(threadId: string): Promise<Thread<ValuesType>>;
|
|
57
|
+
/**
|
|
58
|
+
* 更新线程
|
|
59
|
+
*/
|
|
60
|
+
set(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* 删除线程
|
|
63
|
+
*/
|
|
64
|
+
delete(threadId: string): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* 更新状态
|
|
67
|
+
*/
|
|
68
|
+
updateState(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<{
|
|
69
|
+
configurable: Record<string, any>;
|
|
70
|
+
}>;
|
|
71
|
+
/**
|
|
72
|
+
* 创建运行
|
|
73
|
+
*/
|
|
74
|
+
createRun(threadId: string, assistantId: string, payload?: {
|
|
75
|
+
metadata?: Metadata;
|
|
76
|
+
}): Promise<Run>;
|
|
77
|
+
/**
|
|
78
|
+
* 列出运行
|
|
79
|
+
*/
|
|
80
|
+
listRuns(threadId: string, options?: {
|
|
81
|
+
limit?: number;
|
|
82
|
+
offset?: number;
|
|
83
|
+
status?: RunStatus;
|
|
84
|
+
}): Promise<Run[]>;
|
|
85
|
+
/**
|
|
86
|
+
* 更新运行
|
|
87
|
+
*/
|
|
88
|
+
updateRun(runId: string, run: Partial<Run>): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* 计算线程数量
|
|
91
|
+
*/
|
|
92
|
+
count(query?: {
|
|
93
|
+
ids?: string[];
|
|
94
|
+
metadata?: Metadata;
|
|
95
|
+
status?: any;
|
|
96
|
+
values?: ValuesType;
|
|
97
|
+
}): Promise<number>;
|
|
98
|
+
/**
|
|
99
|
+
* 更新线程元数据
|
|
100
|
+
*/
|
|
101
|
+
patch(threadId: string, updates: Partial<Omit<Thread<ValuesType>, 'thread_id' | 'created_at' | 'updated_at'>>): Promise<Thread<ValuesType>>;
|
|
102
|
+
/**
|
|
103
|
+
* 获取线程状态
|
|
104
|
+
*/
|
|
105
|
+
getState(threadId: string, options?: {
|
|
106
|
+
subgraphs?: boolean;
|
|
107
|
+
checkpointId?: string;
|
|
108
|
+
}): Promise<ThreadState>;
|
|
109
|
+
/**
|
|
110
|
+
* 获取线程历史
|
|
111
|
+
*/
|
|
112
|
+
getStateHistory(threadId: string, options?: {
|
|
113
|
+
limit?: number;
|
|
114
|
+
before?: string;
|
|
115
|
+
filter?: {
|
|
116
|
+
source?: string;
|
|
117
|
+
step?: number;
|
|
118
|
+
};
|
|
119
|
+
}): Promise<ThreadState[]>;
|
|
120
|
+
/**
|
|
121
|
+
* 复制线程
|
|
122
|
+
*/
|
|
123
|
+
copy(threadId: string): Promise<Thread<ValuesType>>;
|
|
124
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseThreadsManager } from '../../threads/index.js';
|
|
2
|
-
import { Command, Config, Metadata, OnConflictBehavior, Run, Thread, ThreadStatus } from '@langgraph-js/sdk';
|
|
2
|
+
import { Command, Config, Metadata, OnConflictBehavior, Run, Thread, ThreadState, ThreadStatus } from '@langgraph-js/sdk';
|
|
3
3
|
import { RunStatus, SortOrder, ThreadSortBy } from '../../types';
|
|
4
4
|
import { DatabaseAdapter } from './adapter';
|
|
5
5
|
/**
|
|
@@ -25,18 +25,21 @@ export declare class KyselyThreadsManager<ValuesType = unknown> implements BaseT
|
|
|
25
25
|
}>;
|
|
26
26
|
}): Promise<Thread<ValuesType>>;
|
|
27
27
|
search(query?: {
|
|
28
|
+
ids?: string[];
|
|
28
29
|
metadata?: Metadata;
|
|
29
30
|
limit?: number;
|
|
30
31
|
offset?: number;
|
|
31
32
|
status?: ThreadStatus;
|
|
32
33
|
sortBy?: ThreadSortBy;
|
|
33
34
|
sortOrder?: SortOrder;
|
|
35
|
+
values?: ValuesType;
|
|
36
|
+
select?: Array<'thread_id' | 'created_at' | 'updated_at' | 'metadata' | 'config' | 'context' | 'status' | 'values' | 'interrupts'>;
|
|
34
37
|
withoutDetails?: boolean;
|
|
35
38
|
}): Promise<Thread<ValuesType>[]>;
|
|
36
39
|
get(threadId: string): Promise<Thread<ValuesType>>;
|
|
37
40
|
set(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<void>;
|
|
38
|
-
updateState(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<Pick<Config, 'configurable'>>;
|
|
39
41
|
delete(threadId: string): Promise<void>;
|
|
42
|
+
updateState(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<Pick<Config, 'configurable'>>;
|
|
40
43
|
createRun(threadId: string, assistantId: string, payload?: {
|
|
41
44
|
metadata?: Metadata;
|
|
42
45
|
}): Promise<Run>;
|
|
@@ -46,4 +49,25 @@ export declare class KyselyThreadsManager<ValuesType = unknown> implements BaseT
|
|
|
46
49
|
status?: RunStatus;
|
|
47
50
|
}): Promise<Run[]>;
|
|
48
51
|
updateRun(runId: string, run: Partial<Run>): Promise<void>;
|
|
52
|
+
count(query?: {
|
|
53
|
+
ids?: string[];
|
|
54
|
+
metadata?: Metadata;
|
|
55
|
+
status?: ThreadStatus;
|
|
56
|
+
values?: ValuesType;
|
|
57
|
+
}): Promise<number>;
|
|
58
|
+
patch(threadId: string, updates: Partial<Omit<Thread<ValuesType>, 'thread_id' | 'created_at' | 'updated_at'>>): Promise<Thread<ValuesType>>;
|
|
59
|
+
getState(threadId: string, options?: {
|
|
60
|
+
subgraphs?: boolean;
|
|
61
|
+
checkpointId?: string;
|
|
62
|
+
}): Promise<ThreadState>;
|
|
63
|
+
getStateHistory(threadId: string, options?: {
|
|
64
|
+
limit?: number;
|
|
65
|
+
before?: string;
|
|
66
|
+
filter?: {
|
|
67
|
+
source?: string;
|
|
68
|
+
step?: number;
|
|
69
|
+
};
|
|
70
|
+
}): Promise<ThreadState[]>;
|
|
71
|
+
copy(threadId: string): Promise<Thread<ValuesType>>;
|
|
72
|
+
private saveCheckpoint;
|
|
49
73
|
}
|
|
@@ -11,6 +11,15 @@ export interface ThreadsTable {
|
|
|
11
11
|
values: any;
|
|
12
12
|
interrupts: Record<string, any>;
|
|
13
13
|
}
|
|
14
|
+
export interface CheckpointsTable {
|
|
15
|
+
checkpoint_id: string;
|
|
16
|
+
thread_id: string;
|
|
17
|
+
values: any;
|
|
18
|
+
next: string[];
|
|
19
|
+
config: any;
|
|
20
|
+
created_at: Date;
|
|
21
|
+
metadata: Record<string, any>;
|
|
22
|
+
}
|
|
14
23
|
export interface RunsTable {
|
|
15
24
|
run_id: string;
|
|
16
25
|
thread_id: string;
|
|
@@ -23,5 +32,6 @@ export interface RunsTable {
|
|
|
23
32
|
}
|
|
24
33
|
export interface Database {
|
|
25
34
|
threads: ThreadsTable;
|
|
35
|
+
checkpoints: CheckpointsTable;
|
|
26
36
|
runs: RunsTable;
|
|
27
37
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { BaseThreadsManager } from '../../threads/index.js';
|
|
2
|
-
import { Command, Config, Metadata, OnConflictBehavior, Run, Thread, ThreadStatus } from '@langgraph-js/sdk';
|
|
2
|
+
import { Command, Config, Metadata, OnConflictBehavior, Run, Thread, ThreadState, ThreadStatus } from '@langgraph-js/sdk';
|
|
3
3
|
import { RunStatus, SortOrder, ThreadSortBy } from '../../types';
|
|
4
4
|
export declare class MemoryThreadsManager<ValuesType = unknown> implements BaseThreadsManager<ValuesType> {
|
|
5
5
|
private threads;
|
|
6
|
+
private checkpoints;
|
|
6
7
|
setup(): Promise<void>;
|
|
7
8
|
create(payload?: {
|
|
8
9
|
metadata?: Metadata;
|
|
@@ -18,14 +19,18 @@ export declare class MemoryThreadsManager<ValuesType = unknown> implements BaseT
|
|
|
18
19
|
}>;
|
|
19
20
|
}): Promise<Thread<ValuesType>>;
|
|
20
21
|
search(query?: {
|
|
22
|
+
ids?: string[];
|
|
21
23
|
metadata?: Metadata;
|
|
22
24
|
limit?: number;
|
|
23
25
|
offset?: number;
|
|
24
26
|
status?: ThreadStatus;
|
|
25
27
|
sortBy?: ThreadSortBy;
|
|
26
28
|
sortOrder?: SortOrder;
|
|
29
|
+
values?: ValuesType;
|
|
30
|
+
select?: Array<'thread_id' | 'created_at' | 'updated_at' | 'metadata' | 'config' | 'context' | 'status' | 'values' | 'interrupts'>;
|
|
27
31
|
withoutDetails?: boolean;
|
|
28
32
|
}): Promise<Thread<ValuesType>[]>;
|
|
33
|
+
private deepEqual;
|
|
29
34
|
get(threadId: string): Promise<Thread<ValuesType>>;
|
|
30
35
|
set(threadId: string, thread: Partial<Thread<ValuesType>>): Promise<void>;
|
|
31
36
|
delete(threadId: string): Promise<void>;
|
|
@@ -40,4 +45,25 @@ export declare class MemoryThreadsManager<ValuesType = unknown> implements BaseT
|
|
|
40
45
|
status?: RunStatus;
|
|
41
46
|
}): Promise<Run[]>;
|
|
42
47
|
updateRun(runId: string, run: Partial<Run>): Promise<void>;
|
|
48
|
+
count(query?: {
|
|
49
|
+
ids?: string[];
|
|
50
|
+
metadata?: Metadata;
|
|
51
|
+
status?: ThreadStatus;
|
|
52
|
+
values?: ValuesType;
|
|
53
|
+
}): Promise<number>;
|
|
54
|
+
patch(threadId: string, updates: Partial<Omit<Thread<ValuesType>, 'thread_id' | 'created_at' | 'updated_at'>>): Promise<Thread<ValuesType>>;
|
|
55
|
+
getState(threadId: string, options?: {
|
|
56
|
+
subgraphs?: boolean;
|
|
57
|
+
checkpointId?: string;
|
|
58
|
+
}): Promise<ThreadState>;
|
|
59
|
+
getStateHistory(threadId: string, options?: {
|
|
60
|
+
limit?: number;
|
|
61
|
+
before?: string;
|
|
62
|
+
filter?: {
|
|
63
|
+
source?: string;
|
|
64
|
+
step?: number;
|
|
65
|
+
};
|
|
66
|
+
}): Promise<ThreadState[]>;
|
|
67
|
+
copy(threadId: string): Promise<Thread<ValuesType>>;
|
|
68
|
+
saveCheckpoint(threadId: string, values: any, next: string[], config: Config, metadata?: Metadata): Promise<void>;
|
|
43
69
|
}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
import { EventMessage } from '../../queue/event_message.js';
|
|
2
2
|
import { BaseStreamQueue } from '../../queue/stream_queue.js';
|
|
3
3
|
import { BaseStreamQueueInterface } from '../../queue/stream_queue.js';
|
|
4
|
-
import { RedisClientType } from 'redis';
|
|
5
4
|
/**
|
|
6
|
-
* Redis 实现的消息队列,用于存储消息
|
|
5
|
+
* Redis Stream 实现的消息队列,用于存储消息
|
|
6
|
+
* 使用 Redis Streams 替代 pub/sub,支持集群模式
|
|
7
7
|
*/
|
|
8
8
|
export declare class RedisStreamQueue extends BaseStreamQueue implements BaseStreamQueueInterface {
|
|
9
9
|
readonly id: string;
|
|
10
10
|
readonly compressMessages: boolean;
|
|
11
11
|
readonly ttl: number;
|
|
12
|
-
static redis: RedisClientType;
|
|
13
|
-
static subscriberRedis: RedisClientType;
|
|
14
|
-
static isQueueExist(id: string): Promise<boolean>;
|
|
15
12
|
private redis;
|
|
16
|
-
private
|
|
17
|
-
private
|
|
18
|
-
private channelKey;
|
|
13
|
+
private streamKey;
|
|
14
|
+
private listKey;
|
|
19
15
|
private isConnected;
|
|
20
16
|
cancelSignal: AbortController;
|
|
17
|
+
private lastStreamId;
|
|
18
|
+
private pollInterval;
|
|
21
19
|
constructor(id: string, compressMessages?: boolean, ttl?: number);
|
|
22
20
|
/**
|
|
23
|
-
* 推送消息到 Redis
|
|
21
|
+
* 推送消息到 Redis Stream 和 List
|
|
22
|
+
* - Stream: 用于实时推送(集群友好)
|
|
23
|
+
* - List: 用于 getAll() 批量获取历史数据
|
|
24
24
|
*/
|
|
25
25
|
push(item: EventMessage): Promise<void>;
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
27
|
+
* 异步生成器:使用 Redis Streams XREAD 轮询消费队列数据
|
|
28
28
|
*/
|
|
29
29
|
onDataReceive(): AsyncGenerator<EventMessage, void, unknown>;
|
|
30
30
|
/**
|
|
31
|
-
*
|
|
31
|
+
* 获取队列中的所有数据(从 List 获取历史数据)
|
|
32
32
|
*/
|
|
33
33
|
getAll(): Promise<EventMessage[]>;
|
|
34
34
|
/**
|
|
@@ -39,5 +39,8 @@ export declare class RedisStreamQueue extends BaseStreamQueue implements BaseStr
|
|
|
39
39
|
* 取消操作
|
|
40
40
|
*/
|
|
41
41
|
cancel(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* 复制队列到另一个队列
|
|
44
|
+
*/
|
|
42
45
|
copyToQueue(toId: string, ttl?: number): Promise<RedisStreamQueue>;
|
|
43
46
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote PostgreSQL Adapter - 简化的 Fetch 工具函数
|
|
3
|
+
*/
|
|
4
|
+
import { RemoteResponse } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* GET 请求
|
|
7
|
+
*/
|
|
8
|
+
export declare function remoteGet<T>(url: string, query?: Record<string, string | number | boolean>): Promise<RemoteResponse<T>>;
|
|
9
|
+
/**
|
|
10
|
+
* POST 请求
|
|
11
|
+
*/
|
|
12
|
+
export declare function remotePost<T>(url: string, body?: any, query?: Record<string, string | number | boolean>): Promise<RemoteResponse<T>>;
|
|
13
|
+
/**
|
|
14
|
+
* PUT 请求
|
|
15
|
+
*/
|
|
16
|
+
export declare function remotePut<T>(url: string, body?: any, query?: Record<string, string | number | boolean>): Promise<RemoteResponse<T>>;
|
|
17
|
+
/**
|
|
18
|
+
* DELETE 请求
|
|
19
|
+
*/
|
|
20
|
+
export declare function remoteDelete<T>(url: string, query?: Record<string, string | number | boolean>): Promise<RemoteResponse<T>>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote PostgreSQL Server
|
|
3
|
+
* 提供 HTTP API 端点,代理 PostgreSQL 操作
|
|
4
|
+
*/
|
|
5
|
+
import { Hono } from 'hono';
|
|
6
|
+
import { BaseThreadsManager } from '../../threads';
|
|
7
|
+
/**
|
|
8
|
+
* Remote Server 类
|
|
9
|
+
*/
|
|
10
|
+
export declare class RemoteServer {
|
|
11
|
+
private threadsManager;
|
|
12
|
+
constructor(threadsManager: BaseThreadsManager);
|
|
13
|
+
/**
|
|
14
|
+
* 创建 Hono 路由
|
|
15
|
+
*/
|
|
16
|
+
getRouter(): Hono;
|
|
17
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote PostgreSQL Server 启动示例
|
|
3
|
+
*
|
|
4
|
+
* 这个文件展示如何启动一个远程 PG 服务器
|
|
5
|
+
* 运行: bun run src/storage/remote/server.ts
|
|
6
|
+
*/
|
|
7
|
+
declare const _default: {
|
|
8
|
+
fetch: (request: Request, Env?: unknown, executionCtx?: import("hono").ExecutionContext) => Response | Promise<Response>;
|
|
9
|
+
port: number;
|
|
10
|
+
};
|
|
11
|
+
export default _default;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote PostgreSQL Adapter 类型定义
|
|
3
|
+
* 定义 API 请求/响应格式和错误类型
|
|
4
|
+
*/
|
|
5
|
+
import { Metadata, OnConflictBehavior, ThreadStatus, Command } from '@langgraph-js/sdk';
|
|
6
|
+
import { RunStatus, SortOrder, ThreadSortBy } from '../../types';
|
|
7
|
+
/**
|
|
8
|
+
* API 响应通用格式
|
|
9
|
+
*/
|
|
10
|
+
export interface RemoteResponse<T = any> {
|
|
11
|
+
success: boolean;
|
|
12
|
+
data?: T;
|
|
13
|
+
error?: {
|
|
14
|
+
code: string;
|
|
15
|
+
message: string;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 错误码枚举
|
|
20
|
+
*/
|
|
21
|
+
export declare enum RemoteErrorCode {
|
|
22
|
+
NETWORK_ERROR = "NETWORK_ERROR",
|
|
23
|
+
CONNECTION_TIMEOUT = "CONNECTION_TIMEOUT",
|
|
24
|
+
INTERNAL_ERROR = "INTERNAL_ERROR",
|
|
25
|
+
THREAD_NOT_FOUND = "THREAD_NOT_FOUND",
|
|
26
|
+
THREAD_BUSY = "THREAD_BUSY",
|
|
27
|
+
RUN_NOT_FOUND = "RUN_NOT_FOUND",
|
|
28
|
+
GRAPH_NOT_FOUND = "GRAPH_NOT_FOUND",
|
|
29
|
+
INVALID_REQUEST = "INVALID_REQUEST"
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 远程 API 错误类
|
|
33
|
+
*/
|
|
34
|
+
export declare class RemoteApiError extends Error {
|
|
35
|
+
code: string;
|
|
36
|
+
statusCode?: number | undefined;
|
|
37
|
+
constructor(code: string, message: string, statusCode?: number | undefined);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Setup API 响应
|
|
41
|
+
*/
|
|
42
|
+
export interface SetupResponse {
|
|
43
|
+
message: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create Thread API 请求
|
|
47
|
+
*/
|
|
48
|
+
export interface CreateThreadRequest {
|
|
49
|
+
metadata?: Metadata;
|
|
50
|
+
threadId?: string;
|
|
51
|
+
ifExists?: OnConflictBehavior;
|
|
52
|
+
graphId?: string;
|
|
53
|
+
supersteps?: Array<{
|
|
54
|
+
updates: Array<{
|
|
55
|
+
values: unknown;
|
|
56
|
+
command?: Command;
|
|
57
|
+
asNode: string;
|
|
58
|
+
}>;
|
|
59
|
+
}>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Search Threads API 请求
|
|
63
|
+
*/
|
|
64
|
+
export interface SearchThreadsRequest {
|
|
65
|
+
ids?: string[];
|
|
66
|
+
metadata?: Metadata;
|
|
67
|
+
limit?: number;
|
|
68
|
+
offset?: number;
|
|
69
|
+
status?: ThreadStatus;
|
|
70
|
+
sortBy?: ThreadSortBy;
|
|
71
|
+
sortOrder?: SortOrder;
|
|
72
|
+
values?: unknown;
|
|
73
|
+
select?: Array<'thread_id' | 'created_at' | 'updated_at' | 'metadata' | 'config' | 'context' | 'status' | 'values' | 'interrupts'>;
|
|
74
|
+
/**
|
|
75
|
+
* @deprecated Use `select` parameter instead for fine-grained field control
|
|
76
|
+
*/
|
|
77
|
+
withoutDetails?: boolean;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Update Thread API 请求
|
|
81
|
+
*/
|
|
82
|
+
export interface UpdateThreadRequest {
|
|
83
|
+
metadata?: Metadata;
|
|
84
|
+
status?: ThreadStatus;
|
|
85
|
+
values?: any;
|
|
86
|
+
interrupts?: Record<string, any>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Update State API 请求
|
|
90
|
+
*/
|
|
91
|
+
export interface UpdateStateRequest {
|
|
92
|
+
values?: any;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Update State API 响应
|
|
96
|
+
*/
|
|
97
|
+
export interface UpdateStateResponse {
|
|
98
|
+
configurable: Record<string, any>;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create Run API 请求
|
|
102
|
+
*/
|
|
103
|
+
export interface CreateRunRequest {
|
|
104
|
+
metadata?: Metadata;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* List Runs API 请求
|
|
108
|
+
*/
|
|
109
|
+
export interface ListRunsRequest {
|
|
110
|
+
limit?: number;
|
|
111
|
+
offset?: number;
|
|
112
|
+
status?: RunStatus;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Update Run API 请求
|
|
116
|
+
*/
|
|
117
|
+
export interface UpdateRunRequest {
|
|
118
|
+
status?: RunStatus;
|
|
119
|
+
metadata?: Metadata;
|
|
120
|
+
multitask_strategy?: 'reject' | 'interrupt' | 'rollback';
|
|
121
|
+
}
|