@langgraph-js/pure-graph 2.7.4 → 2.8.0
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/{index-Dssnefl2.js → adapter/fetch/index.js} +6 -6
- package/dist/adapter/fetch/index.js.map +1 -0
- package/dist/adapter/hono/index.js +1 -1
- package/dist/adapter/nextjs/index.js +2 -2
- package/dist/adapter/zod.d.ts +2 -2
- package/dist/{createEndpoint-CtOcdmjP.js → createEndpoint-u2dnG_xt.js} +14 -3
- package/dist/createEndpoint-u2dnG_xt.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/queue/stream_queue.d.ts +19 -6
- package/dist/{queue-CSCVH9r8.js → queue-kaJOJdKs.js} +19 -9
- package/dist/queue-kaJOJdKs.js.map +1 -0
- package/dist/{router-4ACemgnd.js → router-DOW8vigV.js} +2 -2
- package/dist/{router-4ACemgnd.js.map → router-DOW8vigV.js.map} +1 -1
- package/dist/storage/memory/queue.d.ts +1 -0
- package/dist/storage/redis/queue.d.ts +5 -1
- package/dist/{stream-VZ_Csdid.js → stream-BkrtqGvX.js} +40 -12
- package/dist/stream-BkrtqGvX.js.map +1 -0
- package/package.json +1 -1
- package/dist/createEndpoint-CtOcdmjP.js.map +0 -1
- package/dist/index-Dssnefl2.js.map +0 -1
- package/dist/queue-CSCVH9r8.js.map +0 -1
- package/dist/stream-VZ_Csdid.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { s as serialiseAsDict, L as LangGraphGlobal } from '
|
|
2
|
-
import { c as createEndpoint } from '
|
|
1
|
+
import { s as serialiseAsDict, L as LangGraphGlobal } from '../../stream-BkrtqGvX.js';
|
|
2
|
+
import { c as createEndpoint } from '../../createEndpoint-u2dnG_xt.js';
|
|
3
3
|
import z from 'zod';
|
|
4
4
|
import camelcaseKeys from 'camelcase-keys';
|
|
5
5
|
|
|
@@ -79,8 +79,8 @@ const RunStreamPayloadSchema = z.object({
|
|
|
79
79
|
langsmith_tracer: z.unknown().optional()
|
|
80
80
|
}).describe("Payload for creating a stateful run.");
|
|
81
81
|
const RunListQuerySchema = z.object({
|
|
82
|
-
limit: z.coerce.number().int().optional(),
|
|
83
|
-
offset: z.coerce.number().int().optional(),
|
|
82
|
+
limit: z.coerce.number().int().optional().default(10),
|
|
83
|
+
offset: z.coerce.number().int().optional().default(0),
|
|
84
84
|
status: z.enum(["pending", "running", "error", "success", "timeout", "interrupted"]).optional()
|
|
85
85
|
});
|
|
86
86
|
const RunCancelQuerySchema = z.object({
|
|
@@ -570,5 +570,5 @@ async function handleRequest(req, context = {}) {
|
|
|
570
570
|
}
|
|
571
571
|
}
|
|
572
572
|
|
|
573
|
-
export { handleRequest
|
|
574
|
-
//# sourceMappingURL=index
|
|
573
|
+
export { cancelRun, createThread, deleteThread, getAssistantGraph, getThread, handleRequest, joinRunStream, listRuns, searchAssistants, searchThreads, streamRun, updateThreadState };
|
|
574
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/adapter/fetch/endpoint.ts","../../../src/adapter/zod.ts","../../../src/adapter/fetch/utils.ts","../../../src/adapter/fetch/assistants.ts","../../../src/adapter/fetch/threads.ts","../../../src/adapter/fetch/runs.ts","../../../src/adapter/fetch/index.ts"],"sourcesContent":["import { createEndpoint } from '../../createEndpoint.js';\n\nexport const client = createEndpoint();\n","import z from 'zod';\n\nexport const AssistantConfigurable = z\n .object({\n thread_id: z.string().optional(),\n thread_ts: z.string().optional(),\n })\n .catchall(z.unknown());\n\nexport const AssistantConfig = z\n .object({\n tags: z.array(z.string()).optional(),\n recursion_limit: z.number().int().optional(),\n configurable: AssistantConfigurable.optional(),\n })\n .catchall(z.unknown())\n .describe('The configuration of an assistant.');\n\nexport const Assistant = z.object({\n assistant_id: z.string().uuid(),\n graph_id: z.string(),\n config: AssistantConfig,\n created_at: z.string(),\n updated_at: z.string(),\n metadata: z.object({}).catchall(z.any()),\n});\n\nexport const MetadataSchema = z\n .object({\n source: z.union([z.literal('input'), z.literal('loop'), z.literal('update'), z.string()]).optional(),\n step: z.number().optional(),\n writes: z.any().nullable().optional(),\n parents: z.any().optional(),\n })\n .catchall(z.unknown());\n\nexport const SendSchema = z.object({\n node: z.string(),\n input: z.unknown().optional(),\n});\n\nexport const CommandSchema = z.object({\n update: z\n .union([z.any(), z.array(z.tuple([z.string(), z.any()]))])\n .nullable()\n .optional(),\n resume: z.unknown().optional(),\n goto: z.union([SendSchema, z.array(SendSchema), z.string(), z.array(z.string())]).optional(),\n});\n\n// 公共的查询参数验证 schema\nexport const PaginationQuerySchema = z.object({\n limit: z.number().int().optional(),\n offset: z.number().int().optional(),\n});\n\nexport const ThreadIdParamSchema = z.object({\n thread_id: z.string().uuid(),\n});\n\nexport const RunIdParamSchema = z.object({\n thread_id: z.string().uuid(),\n run_id: z.string().uuid(),\n});\n\n// Assistants 相关的 schema\nexport const AssistantsSearchSchema = z.object({\n graph_id: z.string().optional(),\n metadata: MetadataSchema.optional(),\n limit: z.number().int().optional(),\n offset: z.number().int().optional(),\n});\n\nexport const AssistantGraphQuerySchema = z.object({\n xray: z.string().optional(),\n});\n\n// Runs 相关的 schema\nexport const RunStreamPayloadSchema = z\n .object({\n assistant_id: z.union([z.string().uuid(), z.string()]),\n checkpoint_id: z.string().optional(),\n input: z.any().optional(),\n command: CommandSchema.optional(),\n metadata: MetadataSchema.optional(),\n config: AssistantConfig.optional(),\n webhook: z.string().optional(),\n interrupt_before: z.union([z.literal('*'), z.array(z.string())]).optional(),\n interrupt_after: z.union([z.literal('*'), z.array(z.string())]).optional(),\n on_disconnect: z.enum(['cancel', 'continue']).optional().default('continue'),\n multitask_strategy: z.enum(['reject', 'rollback', 'interrupt', 'enqueue']).optional(),\n stream_mode: z\n .array(z.enum(['values', 'messages', 'messages-tuple', 'updates', 'events', 'debug', 'custom']))\n .optional(),\n stream_subgraphs: z.boolean().optional(),\n stream_resumable: z.boolean().optional(),\n after_seconds: z.number().optional(),\n if_not_exists: z.enum(['create', 'reject']).optional(),\n on_completion: z.enum(['complete', 'continue']).optional(),\n feedback_keys: z.array(z.string()).optional(),\n langsmith_tracer: z.unknown().optional(),\n })\n .describe('Payload for creating a stateful run.');\n\nexport const RunListQuerySchema = z.object({\n limit: z.coerce.number().int().optional().default(10),\n offset: z.coerce.number().int().optional().default(0),\n status: z.enum(['pending', 'running', 'error', 'success', 'timeout', 'interrupted']).optional(),\n});\n\nexport const RunCancelQuerySchema = z.object({\n wait: z.coerce.boolean().optional().default(false),\n action: z.enum(['interrupt', 'rollback']).optional().default('interrupt'),\n});\n\nexport const RunJoinStreamQuerySchema = z.object({\n cancel_on_disconnect: z.coerce.boolean().optional().default(false),\n last_event_id: z.string().optional(),\n stream_mode: z.enum(['values', 'messages', 'messages-tuple', 'updates', 'events', 'debug', 'custom']).optional(),\n});\n\n// Threads 相关的 schema\nexport const ThreadCreatePayloadSchema = z\n .object({\n thread_id: z.string().uuid().describe('The ID of the thread. If not provided, an ID is generated.').optional(),\n metadata: MetadataSchema.optional(),\n if_exists: z.union([z.literal('raise'), z.literal('do_nothing')]).optional(),\n })\n .describe('Payload for creating a thread.');\n\nexport const ThreadSearchPayloadSchema = z\n .object({\n metadata: MetadataSchema.describe('Metadata to search for.').optional(),\n status: z.enum(['idle', 'busy', 'interrupted', 'error']).describe('Filter by thread status.').optional(),\n values: z.any().describe('Filter by thread values.').optional(),\n limit: z.number().int().gte(1).lte(1000).describe('Maximum number to return.').optional(),\n offset: z.number().int().gte(0).describe('Offset to start from.').optional(),\n sort_by: z.enum(['thread_id', 'status', 'created_at', 'updated_at']).describe('Sort by field.').optional(),\n sort_order: z.enum(['asc', 'desc']).describe('Sort order.').optional(),\n without_details: z.boolean().describe('Whether to return values.').optional(),\n })\n .describe('Payload for listing threads.');\n\nexport const ThreadStateUpdate = z\n .object({\n values: z.union([z.record(z.string(), z.unknown()), z.array(z.record(z.string(), z.unknown()))]).nullish(),\n // as_node: z.string().optional(),\n // checkpoint_id: z.string().optional(),\n // checkpoint: CheckpointSchema.nullish(),\n })\n .describe('Payload for adding state to a thread.');\n","import z from 'zod';\n\n/**\n * 解析 URL 路径参数\n */\nexport function parsePathParams(url: string, pattern: string): Record<string, string> {\n const patternParts = pattern.split('/').filter((p) => p);\n const urlParts = new URL(url).pathname.split('/').filter((p) => p);\n const params: Record<string, string> = {};\n\n patternParts.forEach((part, index) => {\n if (part.startsWith(':')) {\n const paramName = part.slice(1);\n params[paramName] = urlParts[index];\n }\n });\n\n return params;\n}\n\n/**\n * 解析查询参数并转换类型\n */\nexport function parseQueryParams(url: string): Record<string, string | number | boolean> {\n const searchParams = new URL(url).searchParams;\n const params: Record<string, string | number | boolean> = {};\n\n searchParams.forEach((value, key) => {\n // 尝试转换为数字\n if (!isNaN(Number(value)) && value !== '') {\n params[key] = Number(value);\n }\n // 尝试转换为布尔值\n else if (value === 'true' || value === 'false') {\n params[key] = value === 'true';\n }\n // 保持字符串\n else {\n params[key] = value;\n }\n });\n\n return params;\n}\n\n/**\n * 验证数据\n */\nexport function validate<T>(schema: z.ZodSchema<T>, data: unknown): T {\n const result = schema.safeParse(data);\n if (!result.success) {\n throw new ValidationError(result.error.issues);\n }\n return result.data;\n}\n\n/**\n * 验证错误\n */\nexport class ValidationError extends Error {\n public errors: z.ZodIssue[];\n\n constructor(errors: z.ZodIssue[]) {\n super('Validation failed');\n this.name = 'ValidationError';\n this.errors = errors;\n }\n}\n\n/**\n * 创建 JSON 响应\n */\nexport function jsonResponse(data: any, status = 200, headers?: Record<string, string>): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n });\n}\n\n/**\n * 创建错误响应\n */\nexport function errorResponse(error: unknown, status = 500): Response {\n if (error instanceof ValidationError) {\n return jsonResponse(\n {\n error: 'Validation Error',\n details: error.errors,\n },\n 400,\n );\n }\n\n return jsonResponse(\n {\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n status,\n );\n}\n\n/**\n * 创建 SSE 流响应\n */\nexport function createSSEStream(streamFn: (writer: SSEWriter) => Promise<void>): Response {\n let controller: ReadableStreamDefaultController<Uint8Array>;\n let isClosed = false;\n\n const stream = new ReadableStream<Uint8Array>({\n async start(ctrl) {\n controller = ctrl;\n const encoder = new TextEncoder();\n\n const writer: SSEWriter = {\n writeSSE: async ({ data, event, id }) => {\n // 检查流是否已关闭\n if (isClosed) {\n return;\n }\n\n try {\n let message = '';\n\n if (id) {\n message += `id: ${id}\\n`;\n }\n if (event) {\n message += `event: ${event}\\n`;\n }\n message += `data: ${data}\\n\\n`;\n\n controller.enqueue(encoder.encode(message));\n } catch (error) {\n // 忽略写入已关闭流的错误\n if (!isClosed) {\n throw error;\n }\n }\n },\n close: () => {\n if (!isClosed) {\n isClosed = true;\n try {\n controller.close();\n } catch (error) {\n // 流可能已经关闭\n }\n }\n },\n };\n\n try {\n await streamFn(writer);\n } catch (error) {\n console.error('SSE stream error:', error);\n } finally {\n if (!isClosed) {\n isClosed = true;\n try {\n controller.close();\n } catch (error) {\n // 流可能已经关闭\n }\n }\n }\n },\n cancel() {\n isClosed = true;\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n },\n });\n}\n\nexport interface SSEWriter {\n writeSSE: (data: { data: string; event?: string; id?: string }) => Promise<void>;\n close: () => void;\n}\n\n/**\n * 为 SSE 流添加心跳功能\n */\nexport function withHeartbeat(\n streamFn: (writer: SSEWriter) => Promise<void>,\n heartbeatInterval: number = process.env.HEARTBEAT_INTERVAL ? parseInt(process.env.HEARTBEAT_INTERVAL) : 1500,\n): (writer: SSEWriter) => Promise<void> {\n return async (writer: SSEWriter) => {\n let heartbeatTimer: NodeJS.Timeout | null = null;\n\n const startHeartbeat = () => {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n }\n heartbeatTimer = setInterval(async () => {\n try {\n await writer.writeSSE({ event: 'ping', data: '{}' });\n } catch (error) {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n heartbeatTimer = null;\n }\n }\n }, heartbeatInterval);\n };\n\n const stopHeartbeat = () => {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n heartbeatTimer = null;\n }\n };\n\n const proxiedWriter: SSEWriter = {\n writeSSE: async (data) => {\n stopHeartbeat();\n await writer.writeSSE(data);\n startHeartbeat();\n },\n close: () => {\n stopHeartbeat();\n writer.close();\n },\n };\n\n startHeartbeat();\n\n try {\n await streamFn(proxiedWriter);\n } finally {\n stopHeartbeat();\n }\n };\n}\n","import { client } from './endpoint';\nimport { AssistantsSearchSchema, AssistantGraphQuerySchema } from '../zod';\nimport camelcaseKeys from 'camelcase-keys';\nimport { parseQueryParams, validate, jsonResponse, errorResponse } from './utils';\nimport { LangGraphServerContext } from './context';\n\n/**\n * POST /assistants/search\n */\nexport async function searchAssistants(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const body = await req.json();\n const payload = validate(AssistantsSearchSchema, body);\n\n const data = await client.assistants.search(camelcaseKeys(payload));\n\n return jsonResponse(data, 200, {\n 'X-Pagination-Total': '0',\n });\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * GET /assistants/:assistant_id/graph\n */\nexport async function getAssistantGraph(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const url = new URL(req.url);\n const pathParts = url.pathname.split('/').filter((p) => p);\n const assistant_id = pathParts[1]; // assistants/:assistant_id/graph\n\n const queryParams = parseQueryParams(req.url);\n const { xray } = validate(AssistantGraphQuerySchema, queryParams);\n\n const data = await client.assistants.getGraph(assistant_id, {\n xray: xray !== undefined ? xray === 'true' : undefined,\n });\n\n return jsonResponse(data);\n } catch (error) {\n return errorResponse(error);\n }\n}\n","import { client } from './endpoint';\nimport { ThreadIdParamSchema, ThreadCreatePayloadSchema, ThreadSearchPayloadSchema } from '../zod';\nimport camelcaseKeys from 'camelcase-keys';\nimport { parsePathParams, validate, jsonResponse, errorResponse } from './utils';\nimport { LangGraphServerContext } from './context';\n\n/**\n * POST /threads\n */\nexport async function createThread(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const body = await req.json();\n const payload = validate(ThreadCreatePayloadSchema, body);\n\n const thread = await client.threads.create(camelcaseKeys(payload));\n\n return jsonResponse(thread);\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * POST /threads/search\n */\nexport async function searchThreads(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const body = await req.json();\n const payload = validate(ThreadSearchPayloadSchema, body);\n\n const result = await client.threads.search(camelcaseKeys(payload));\n\n return jsonResponse(result, 200, {\n 'X-Pagination-Total': result.length.toString(),\n });\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * GET /threads/:thread_id\n */\nexport async function getThread(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id');\n const { thread_id } = validate(ThreadIdParamSchema, params);\n\n const thread = await client.threads.get(thread_id);\n\n return jsonResponse(thread);\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * DELETE /threads/:thread_id\n */\nexport async function deleteThread(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id');\n const { thread_id } = validate(ThreadIdParamSchema, params);\n\n await client.threads.delete(thread_id);\n\n return new Response(null, { status: 204 });\n } catch (error) {\n return errorResponse(error);\n }\n}\n","import { client } from './endpoint';\nimport {\n ThreadIdParamSchema,\n RunIdParamSchema,\n RunStreamPayloadSchema,\n RunListQuerySchema,\n RunCancelQuerySchema,\n RunJoinStreamQuerySchema,\n ThreadStateUpdate,\n} from '../zod';\nimport { serialiseAsDict } from '../../graph/stream';\nimport z from 'zod';\nimport camelcaseKeys from 'camelcase-keys';\nimport {\n parsePathParams,\n parseQueryParams,\n validate,\n jsonResponse,\n errorResponse,\n createSSEStream,\n withHeartbeat,\n} from './utils';\nimport { LangGraphServerContext } from './context';\n\n/**\n * POST /threads/:thread_id/runs/stream\n */\nexport async function streamRun(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id/runs/stream');\n const { thread_id } = validate(ThreadIdParamSchema, params);\n\n const body = await req.json();\n const payload = validate(RunStreamPayloadSchema, body);\n\n return createSSEStream(\n withHeartbeat(async (writer) => {\n payload.config = payload.config || {};\n payload.config.configurable = payload.config.configurable || {};\n\n const langgraphContext = context?.langgraph_context;\n if (langgraphContext) {\n Object.assign(payload.config.configurable, langgraphContext);\n }\n\n for await (const { event, data } of client.runs.stream(\n thread_id,\n payload.assistant_id,\n camelcaseKeys(payload) as any,\n )) {\n await writer.writeSSE({ data: serialiseAsDict(data) ?? '', event });\n }\n }),\n );\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * GET /threads/:thread_id/runs/:run_id/stream\n */\nexport async function joinRunStream(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id/runs/:run_id/stream');\n const { thread_id, run_id } = validate(RunIdParamSchema, params);\n\n const queryParams = parseQueryParams(req.url);\n const { cancel_on_disconnect, last_event_id, stream_mode } = validate(RunJoinStreamQuerySchema, queryParams);\n\n return createSSEStream(\n withHeartbeat(async (writer) => {\n const controller = new AbortController();\n\n if (cancel_on_disconnect) {\n const cleanup = () => {\n controller.abort('Client disconnected');\n };\n\n // 监听请求的 abort 信号\n req.signal?.addEventListener('abort', cleanup);\n }\n\n try {\n for await (const { event, data, id } of client.runs.joinStream(thread_id, run_id, {\n signal: controller.signal,\n cancelOnDisconnect: cancel_on_disconnect,\n lastEventId: last_event_id,\n streamMode: stream_mode ? [stream_mode] : undefined,\n })) {\n await writer.writeSSE({\n data: serialiseAsDict(data) ?? '',\n event: event as unknown as string,\n id,\n });\n }\n } catch (error) {\n if (!(error instanceof Error) || !error.message.includes('user cancel')) {\n console.error('Join stream error:', error);\n await writer.writeSSE({\n event: 'error',\n data: JSON.stringify({\n error: error instanceof Error ? error.message : 'Unknown error',\n }),\n });\n }\n }\n }),\n );\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * GET /threads/:thread_id/runs\n */\nexport async function listRuns(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id/runs');\n const { thread_id } = validate(ThreadIdParamSchema, params);\n\n const queryParams = parseQueryParams(req.url);\n const { limit, offset, status } = validate(RunListQuerySchema, queryParams);\n\n const runs = await client.runs.list(thread_id, { limit, offset, status });\n\n return jsonResponse(runs);\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * POST /threads/:thread_id/runs/:run_id/cancel\n */\nexport async function cancelRun(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id/runs/:run_id/cancel');\n const { thread_id, run_id } = validate(RunIdParamSchema, params);\n\n const queryParams = parseQueryParams(req.url);\n const { wait, action } = validate(RunCancelQuerySchema, queryParams);\n\n const cancel = client.runs.cancel(thread_id, run_id, wait, action);\n\n if (wait) {\n await cancel;\n }\n\n return new Response(null, { status: wait ? 204 : 202 });\n } catch (error) {\n return errorResponse(error);\n }\n}\n\n/**\n * POST /threads/:thread_id/state\n */\nexport async function updateThreadState(req: Request, context: LangGraphServerContext): Promise<Response> {\n try {\n const params = parsePathParams(req.url, '/threads/:thread_id/state');\n const { thread_id } = validate(z.object({ thread_id: z.string().uuid() }), params);\n\n const body = await req.json();\n const payload = validate(ThreadStateUpdate, body);\n\n const inserted = await client.threads.updateState(thread_id, payload);\n\n return jsonResponse(inserted);\n } catch (error) {\n return errorResponse(error);\n }\n}\n","import { LangGraphGlobal } from '../../global';\nimport { searchAssistants, getAssistantGraph } from './assistants';\nimport { createThread, searchThreads, getThread, deleteThread } from './threads';\nimport { streamRun, joinRunStream, listRuns, cancelRun, updateThreadState } from './runs';\nimport { errorResponse } from './utils';\nimport type { LangGraphServerContext } from './context';\n/**\n * 路由匹配器\n */\ninterface Route {\n method: string;\n pattern: RegExp;\n handler: (req: Request, context: LangGraphServerContext) => Promise<Response>;\n}\n\nconst routes: Route[] = [\n // Assistants\n {\n method: 'POST',\n pattern: /^\\/assistants\\/search$/,\n handler: searchAssistants,\n },\n {\n method: 'GET',\n pattern: /^\\/assistants\\/[^/]+\\/graph$/,\n handler: getAssistantGraph,\n },\n\n // Threads\n {\n method: 'POST',\n pattern: /^\\/threads$/,\n handler: createThread,\n },\n {\n method: 'POST',\n pattern: /^\\/threads\\/search$/,\n handler: searchThreads,\n },\n {\n method: 'GET',\n pattern: /^\\/threads\\/[^/]+$/,\n handler: getThread,\n },\n {\n method: 'DELETE',\n pattern: /^\\/threads\\/[^/]+$/,\n handler: deleteThread,\n },\n\n // Runs\n {\n method: 'POST',\n pattern: /^\\/threads\\/[^/]+\\/runs\\/stream$/,\n handler: streamRun,\n },\n {\n method: 'GET',\n pattern: /^\\/threads\\/[^/]+\\/runs\\/[^/]+\\/stream$/,\n handler: joinRunStream,\n },\n {\n method: 'GET',\n pattern: /^\\/threads\\/[^/]+\\/runs$/,\n handler: listRuns,\n },\n {\n method: 'POST',\n pattern: /^\\/threads\\/[^/]+\\/runs\\/[^/]+\\/cancel$/,\n handler: cancelRun,\n },\n {\n method: 'POST',\n pattern: /^\\/threads\\/[^/]+\\/state$/,\n handler: updateThreadState,\n },\n];\n\nconst replaceRequest = (req: Request) => {\n const path = new URL(req.url).pathname.toString();\n let basePath = '';\n if (path.includes('/threads')) {\n basePath = path.split('/threads')[0];\n } else if (path.includes('/assistants')) {\n basePath = path.split('/assistants')[0];\n }\n return new Request(req.url.replace(basePath, ''), {\n method: req.method,\n headers: req.headers,\n body: req.body,\n duplex: req.duplex,\n });\n};\n\n/**\n * 主路由处理器\n */\nexport async function handleRequest(req: Request, context: LangGraphServerContext = {}): Promise<Response> {\n req = replaceRequest(req);\n try {\n // 初始化全局配置\n await LangGraphGlobal.initGlobal();\n\n const url = new URL(req.url);\n const pathname = url.pathname;\n const method = req.method;\n\n // 查找匹配的路由\n for (const route of routes) {\n if (route.method === method && route.pattern.test(pathname)) {\n return await route.handler(req, context);\n }\n }\n\n // 未找到路由\n return new Response('Not Found', { status: 404 });\n } catch (error) {\n console.error('Request error:', error);\n return errorResponse(error);\n }\n}\n\n// 导出所有处理函数供直接使用\nexport * from './assistants';\nexport * from './threads';\nexport * from './runs';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { L as LangGraphGlobal } from '../../stream-
|
|
1
|
+
import { L as LangGraphGlobal } from '../../stream-BkrtqGvX.js';
|
|
2
2
|
|
|
3
3
|
async function ensureInitialized(attachGraphPromise) {
|
|
4
4
|
if (globalThis.LG_INIT_PROMISE === void 0) {
|
|
5
5
|
globalThis.LG_INIT_PROMISE = (async () => {
|
|
6
6
|
await LangGraphGlobal.initGlobal();
|
|
7
7
|
await attachGraphPromise();
|
|
8
|
-
const { GET, POST, DELETE } = await import('../../router-
|
|
8
|
+
const { GET, POST, DELETE } = await import('../../router-DOW8vigV.js');
|
|
9
9
|
return {
|
|
10
10
|
GET,
|
|
11
11
|
POST,
|
package/dist/adapter/zod.d.ts
CHANGED
|
@@ -138,8 +138,8 @@ export declare const RunStreamPayloadSchema: z.ZodObject<{
|
|
|
138
138
|
langsmith_tracer: z.ZodOptional<z.ZodUnknown>;
|
|
139
139
|
}, z.core.$strip>;
|
|
140
140
|
export declare const RunListQuerySchema: z.ZodObject<{
|
|
141
|
-
limit: z.ZodOptional<z.ZodCoercedNumber<unknown
|
|
142
|
-
offset: z.ZodOptional<z.ZodCoercedNumber<unknown
|
|
141
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
142
|
+
offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
143
143
|
status: z.ZodOptional<z.ZodEnum<{
|
|
144
144
|
pending: "pending";
|
|
145
145
|
running: "running";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { L as LangGraphGlobal, a as streamState, g as getGraph, G as GRAPHS } from './stream-
|
|
1
|
+
import { L as LangGraphGlobal, a as streamState, g as getGraph, G as GRAPHS } from './stream-BkrtqGvX.js';
|
|
2
2
|
|
|
3
3
|
const AssistantEndpoint = {
|
|
4
4
|
async search(query) {
|
|
@@ -83,7 +83,18 @@ const createEndpoint = () => {
|
|
|
83
83
|
const config = options && typeof options === "object" && "signal" in options ? options : {};
|
|
84
84
|
const signal = (options instanceof AbortSignal ? options : config.signal) || new AbortController().signal;
|
|
85
85
|
try {
|
|
86
|
-
const queue = LangGraphGlobal.globalMessageQueue.getQueue(runId);
|
|
86
|
+
const queue = await LangGraphGlobal.globalMessageQueue.getQueue(runId);
|
|
87
|
+
const allData = await queue.getAll();
|
|
88
|
+
for (const eventMessage of allData) {
|
|
89
|
+
yield {
|
|
90
|
+
id: eventMessage.id,
|
|
91
|
+
event: eventMessage.event,
|
|
92
|
+
data: eventMessage.data
|
|
93
|
+
};
|
|
94
|
+
if (eventMessage.event === "__stream_end__" || eventMessage.event === "__stream_error__" || eventMessage.event === "__stream_cancel__") {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
87
98
|
for await (const eventMessage of queue.onDataReceive()) {
|
|
88
99
|
if (signal.aborted) {
|
|
89
100
|
break;
|
|
@@ -108,4 +119,4 @@ const createEndpoint = () => {
|
|
|
108
119
|
};
|
|
109
120
|
|
|
110
121
|
export { AssistantEndpoint as A, createEndpoint as c };
|
|
111
|
-
//# sourceMappingURL=createEndpoint-
|
|
122
|
+
//# sourceMappingURL=createEndpoint-u2dnG_xt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createEndpoint-u2dnG_xt.js","sources":["../src/createEndpoint.ts"],"sourcesContent":["import { StreamEvent } from '@langchain/core/tracers/log_stream';\nimport { streamState } from './graph/stream.js';\nimport { Assistant, Run, StreamMode, Metadata, AssistantGraph } from '@langchain/langgraph-sdk';\nimport { getGraph, GRAPHS } from './utils/getGraph.js';\nimport { LangGraphGlobal } from './global.js';\nimport { AssistantSortBy, CancelAction, ILangGraphClient, RunStatus, SortOrder, StreamInputData } from './types.js';\nexport { registerGraph } from './utils/getGraph.js';\n\nexport const AssistantEndpoint: ILangGraphClient['assistants'] = {\n async search(query?: {\n graphId?: string;\n metadata?: Metadata;\n limit?: number;\n offset?: number;\n sortBy?: AssistantSortBy;\n sortOrder?: SortOrder;\n }): Promise<Assistant[]> {\n if (query?.graphId) {\n return [\n {\n assistant_id: query.graphId,\n graph_id: query.graphId,\n config: {},\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n metadata: {},\n version: 1,\n name: query.graphId,\n description: '',\n } as Assistant,\n ];\n }\n return Object.entries(GRAPHS).map(\n ([graphId, _]) =>\n ({\n assistant_id: graphId,\n graph_id: graphId,\n config: {},\n metadata: {},\n version: 1,\n name: graphId,\n description: '',\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n } as Assistant),\n );\n },\n async getGraph(assistantId: string, options?: { xray?: boolean | number }): Promise<AssistantGraph> {\n const config = {};\n const graph = await getGraph(assistantId, config);\n const drawable = await graph.getGraphAsync({\n ...config,\n xray: options?.xray ?? undefined,\n });\n return drawable.toJSON() as AssistantGraph;\n },\n};\n\nexport const createEndpoint = () => {\n const getThreads = () => {\n return LangGraphGlobal.globalThreadsManager;\n };\n return {\n assistants: AssistantEndpoint,\n get threads() {\n return LangGraphGlobal.globalThreadsManager;\n },\n runs: {\n list(\n threadId: string,\n options?: {\n limit?: number;\n offset?: number;\n status?: RunStatus;\n },\n ): Promise<Run[]> {\n return getThreads().listRuns(threadId, options);\n },\n async cancel(threadId: string, runId: string, wait?: boolean, action?: CancelAction): Promise<void> {\n return LangGraphGlobal.globalMessageQueue.cancelQueue(runId);\n },\n async *stream(threadId: string, assistantId: string, payload: StreamInputData) {\n payload.config = {\n ...(payload.config ?? {}),\n configurable: {\n ...(payload.config?.configurable ?? {}),\n graph_id: assistantId,\n thread_id: threadId,\n },\n };\n const threads = getThreads();\n for await (const data of streamState(\n threads,\n threads.createRun(threadId, assistantId, payload),\n payload,\n {\n attempt: 0,\n getGraph,\n },\n )) {\n yield data;\n }\n },\n async *joinStream(\n threadId: string,\n runId: string,\n options?:\n | {\n signal?: AbortSignal;\n cancelOnDisconnect?: boolean;\n lastEventId?: string;\n streamMode?: StreamMode | StreamMode[];\n }\n | AbortSignal,\n ): AsyncGenerator<{ id?: string; event: StreamEvent; data: any }> {\n // 处理参数兼容性\n const config = options && typeof options === 'object' && 'signal' in options ? options : {};\n const signal =\n (options instanceof AbortSignal ? options : config.signal) || new AbortController().signal;\n\n try {\n // 获取 Redis 队列实例\n const queue = await LangGraphGlobal.globalMessageQueue.getQueue(runId);\n const allData = await queue.getAll();\n for (const eventMessage of allData) {\n yield {\n id: eventMessage.id,\n event: eventMessage.event as unknown as StreamEvent,\n data: eventMessage.data,\n };\n // 如果是流结束信号,停止监听\n if (\n eventMessage.event === '__stream_end__' ||\n eventMessage.event === '__stream_error__' ||\n eventMessage.event === '__stream_cancel__'\n ) {\n return;\n }\n }\n // 监听队列数据并转换格式\n for await (const eventMessage of queue.onDataReceive()) {\n // 检查是否被取消\n if (signal.aborted) {\n break;\n }\n\n // 转换 EventMessage 为期望的格式\n const event = eventMessage.event as unknown as StreamEvent;\n const data = eventMessage.data;\n\n yield {\n id: eventMessage.id,\n event,\n data,\n };\n\n // 如果是流结束信号,停止监听\n if (\n eventMessage.event === '__stream_end__' ||\n eventMessage.event === '__stream_error__' ||\n eventMessage.event === '__stream_cancel__'\n ) {\n break;\n }\n }\n } catch (error) {\n // 如果队列不存在或其他错误,记录警告但不抛出错误\n console.warn('Join stream failed:', error);\n }\n },\n },\n };\n};\n"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { A as AssistantEndpoint, c as createEndpoint } from './createEndpoint-
|
|
2
|
-
export { L as LangGraphGlobal, r as registerGraph } from './stream-
|
|
1
|
+
export { A as AssistantEndpoint, c as createEndpoint } from './createEndpoint-u2dnG_xt.js';
|
|
2
|
+
export { L as LangGraphGlobal, r as registerGraph } from './stream-BkrtqGvX.js';
|
|
3
3
|
import { StateGraph, entrypoint, getPreviousState, getConfig } from '@langchain/langgraph';
|
|
4
4
|
import { schemaMetaRegistry } from '@langchain/langgraph/zod';
|
|
5
5
|
import { getDefaultsForSchema } from 'zod-defaults';
|
|
@@ -18,6 +18,7 @@ interface StreamQueueEvents<T extends EventMessage> {
|
|
|
18
18
|
export declare class BaseStreamQueue extends EventEmitter<StreamQueueEvents<EventMessage>> {
|
|
19
19
|
readonly id: string;
|
|
20
20
|
readonly compressMessages: boolean;
|
|
21
|
+
readonly ttl: number;
|
|
21
22
|
/** 序列化器实例 / Serializer instance */
|
|
22
23
|
serializer: JsonPlusSerializer;
|
|
23
24
|
/**
|
|
@@ -25,7 +26,7 @@ export declare class BaseStreamQueue extends EventEmitter<StreamQueueEvents<Even
|
|
|
25
26
|
* Constructor
|
|
26
27
|
* @param compressMessages 是否压缩消息 / Whether to compress messages
|
|
27
28
|
*/
|
|
28
|
-
constructor(id: string, compressMessages?: boolean);
|
|
29
|
+
constructor(id: string, compressMessages?: boolean, ttl?: number);
|
|
29
30
|
/**
|
|
30
31
|
* 编码数据为 Uint8Array
|
|
31
32
|
* Encode data to Uint8Array
|
|
@@ -70,7 +71,12 @@ export interface BaseStreamQueueInterface {
|
|
|
70
71
|
cancelSignal: AbortController;
|
|
71
72
|
/** 取消操作 / Cancel operation */
|
|
72
73
|
cancel(): void;
|
|
74
|
+
/** 复制队列数据 / Copy queue data */
|
|
75
|
+
copyToQueue(toId: string, ttl?: number): Promise<BaseStreamQueueInterface>;
|
|
73
76
|
}
|
|
77
|
+
export type QueueConstructor<Q extends BaseStreamQueueInterface> = (new (queueId: string, compressMessages: boolean, ttl?: number) => Q) & {
|
|
78
|
+
isQueueExist?: (id: string) => Promise<boolean>;
|
|
79
|
+
};
|
|
74
80
|
/**
|
|
75
81
|
* StreamQueue 管理器,通过 id 管理多个队列实例
|
|
76
82
|
* StreamQueue manager, manages multiple queue instances by id
|
|
@@ -88,7 +94,7 @@ export declare class StreamQueueManager<Q extends BaseStreamQueueInterface> {
|
|
|
88
94
|
* @param queueConstructor 队列构造函数 / Queue constructor
|
|
89
95
|
* @param options 配置选项 / Configuration options
|
|
90
96
|
*/
|
|
91
|
-
constructor(queueConstructor:
|
|
97
|
+
constructor(queueConstructor: QueueConstructor<Q>, options?: {
|
|
92
98
|
/** 默认是否压缩消息 / Default compress messages setting */
|
|
93
99
|
defaultCompressMessages?: boolean;
|
|
94
100
|
});
|
|
@@ -99,7 +105,7 @@ export declare class StreamQueueManager<Q extends BaseStreamQueueInterface> {
|
|
|
99
105
|
* @param compressMessages 是否压缩消息 / Whether to compress messages
|
|
100
106
|
* @returns 创建的队列实例 / Created queue instance
|
|
101
107
|
*/
|
|
102
|
-
createQueue(id: string,
|
|
108
|
+
createQueue(id: string, ttl?: number): Q;
|
|
103
109
|
/**
|
|
104
110
|
* 获取或创建指定 id 的队列
|
|
105
111
|
* Get or create queue with specified id
|
|
@@ -107,7 +113,7 @@ export declare class StreamQueueManager<Q extends BaseStreamQueueInterface> {
|
|
|
107
113
|
* @param compressMessages 是否压缩消息,默认为构造函数中的默认值 / Whether to compress messages, defaults to constructor default
|
|
108
114
|
* @returns StreamQueue 实例 / StreamQueue instance
|
|
109
115
|
*/
|
|
110
|
-
getQueue(id: string): Q
|
|
116
|
+
getQueue(id: string): Promise<Q>;
|
|
111
117
|
/**
|
|
112
118
|
* 取消指定 id 的队列
|
|
113
119
|
* Cancel queue with specified id
|
|
@@ -119,9 +125,8 @@ export declare class StreamQueueManager<Q extends BaseStreamQueueInterface> {
|
|
|
119
125
|
* Push data to queue with specified id
|
|
120
126
|
* @param id 队列 ID / Queue ID
|
|
121
127
|
* @param item 要推送的数据项 / Item to push
|
|
122
|
-
* @param compressMessages 是否压缩消息,默认为构造函数中的默认值 / Whether to compress messages, defaults to constructor default
|
|
123
128
|
*/
|
|
124
|
-
pushToQueue(id: string, item: EventMessage
|
|
129
|
+
pushToQueue(id: string, item: EventMessage): Promise<void>;
|
|
125
130
|
/**
|
|
126
131
|
* 获取指定 id 队列中的所有数据
|
|
127
132
|
* Get all data from queue with specified id
|
|
@@ -159,5 +164,13 @@ export declare class StreamQueueManager<Q extends BaseStreamQueueInterface> {
|
|
|
159
164
|
* Clear all queues
|
|
160
165
|
*/
|
|
161
166
|
clearAllQueues(): void;
|
|
167
|
+
/**
|
|
168
|
+
* 复制队列数据
|
|
169
|
+
* Copy queue data
|
|
170
|
+
* @param fromId 源队列 ID / Source queue ID
|
|
171
|
+
* @param toId 目标队列 ID / Target queue ID
|
|
172
|
+
* @param ttl 生存时间(毫秒),在指定时间后删除目标队列 / Time to live (milliseconds), remove target queue after specified time
|
|
173
|
+
*/
|
|
174
|
+
copyQueue(fromId: string, toId: string, ttl?: number): Promise<BaseStreamQueueInterface>;
|
|
162
175
|
}
|
|
163
176
|
export {};
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { B as BaseStreamQueue, C as CancelEventMessage } from './stream-
|
|
1
|
+
import { B as BaseStreamQueue, C as CancelEventMessage } from './stream-BkrtqGvX.js';
|
|
2
2
|
import { createClient } from 'redis';
|
|
3
3
|
|
|
4
4
|
class RedisStreamQueue extends BaseStreamQueue {
|
|
5
|
-
constructor(id =
|
|
6
|
-
super(id, true);
|
|
5
|
+
constructor(id, compressMessages = true, ttl = 300) {
|
|
6
|
+
super(id, true, ttl);
|
|
7
7
|
this.id = id;
|
|
8
|
+
this.compressMessages = compressMessages;
|
|
9
|
+
this.ttl = ttl;
|
|
8
10
|
this.queueKey = `queue:${this.id}`;
|
|
9
11
|
this.channelKey = `channel:${this.id}`;
|
|
10
12
|
this.redis = RedisStreamQueue.redis;
|
|
@@ -20,6 +22,9 @@ class RedisStreamQueue extends BaseStreamQueue {
|
|
|
20
22
|
}
|
|
21
23
|
static redis = createClient({ url: process.env.REDIS_URL });
|
|
22
24
|
static subscriberRedis = createClient({ url: process.env.REDIS_URL });
|
|
25
|
+
static isQueueExist(id) {
|
|
26
|
+
return this.redis.exists(`queue:${id}`).then((exists) => exists > 0);
|
|
27
|
+
}
|
|
23
28
|
redis;
|
|
24
29
|
subscriberRedis;
|
|
25
30
|
queueKey;
|
|
@@ -32,8 +37,8 @@ class RedisStreamQueue extends BaseStreamQueue {
|
|
|
32
37
|
async push(item) {
|
|
33
38
|
const data = await this.encodeData(item);
|
|
34
39
|
const serializedData = Buffer.from(data);
|
|
35
|
-
await this.redis.
|
|
36
|
-
await this.redis.expire(this.queueKey,
|
|
40
|
+
await this.redis.rPush(this.queueKey, serializedData);
|
|
41
|
+
await this.redis.expire(this.queueKey, this.ttl);
|
|
37
42
|
await this.redis.publish(this.channelKey, serializedData);
|
|
38
43
|
this.emit("dataChange", data);
|
|
39
44
|
}
|
|
@@ -94,9 +99,8 @@ class RedisStreamQueue extends BaseStreamQueue {
|
|
|
94
99
|
}
|
|
95
100
|
if (this.compressMessages) {
|
|
96
101
|
return await Promise.all(
|
|
97
|
-
data.map(
|
|
98
|
-
|
|
99
|
-
return await this.decodeData(parsed);
|
|
102
|
+
data.map((item) => {
|
|
103
|
+
return this.decodeData(item);
|
|
100
104
|
})
|
|
101
105
|
);
|
|
102
106
|
} else {
|
|
@@ -118,7 +122,13 @@ class RedisStreamQueue extends BaseStreamQueue {
|
|
|
118
122
|
this.push(new CancelEventMessage());
|
|
119
123
|
this.cancelSignal.abort("user cancel this run");
|
|
120
124
|
}
|
|
125
|
+
async copyToQueue(toId, ttl) {
|
|
126
|
+
const queue = new RedisStreamQueue(toId, this.compressMessages, ttl ?? this.ttl);
|
|
127
|
+
await this.redis.copy(this.queueKey, queue.queueKey);
|
|
128
|
+
await this.redis.expire(queue.queueKey, ttl ?? this.ttl);
|
|
129
|
+
return queue;
|
|
130
|
+
}
|
|
121
131
|
}
|
|
122
132
|
|
|
123
133
|
export { RedisStreamQueue };
|
|
124
|
-
//# sourceMappingURL=queue-
|
|
134
|
+
//# sourceMappingURL=queue-kaJOJdKs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-kaJOJdKs.js","sources":["../src/storage/redis/queue.ts"],"sourcesContent":["import { CancelEventMessage, EventMessage } from '../../queue/event_message.js';\nimport { BaseStreamQueue } from '../../queue/stream_queue.js';\nimport { BaseStreamQueueInterface } from '../../queue/stream_queue.js';\nimport { createClient, RedisClientType } from 'redis';\n\n/**\n * Redis 实现的消息队列,用于存储消息\n */\nexport class RedisStreamQueue extends BaseStreamQueue implements BaseStreamQueueInterface {\n static redis: RedisClientType = createClient({ url: process.env.REDIS_URL! });\n static subscriberRedis: RedisClientType = createClient({ url: process.env.REDIS_URL! });\n static isQueueExist(id: string): Promise<boolean> {\n return this.redis.exists(`queue:${id}`).then((exists) => exists > 0);\n }\n private redis: RedisClientType;\n private subscriberRedis: RedisClientType;\n private queueKey: string;\n private channelKey: string;\n private isConnected = false;\n public cancelSignal: AbortController;\n\n constructor(readonly id: string, readonly compressMessages: boolean = true, readonly ttl: number = 300) {\n super(id, true, ttl);\n this.queueKey = `queue:${this.id}`;\n this.channelKey = `channel:${this.id}`;\n this.redis = RedisStreamQueue.redis;\n this.subscriberRedis = RedisStreamQueue.subscriberRedis;\n this.cancelSignal = new AbortController();\n\n // 连接 Redis 客户端(检查是否已经连接)\n if (!this.redis.isOpen) {\n this.redis.connect();\n }\n if (!this.subscriberRedis.isOpen) {\n this.subscriberRedis.connect();\n }\n this.isConnected = true;\n }\n\n /**\n * 推送消息到 Redis 队列\n */\n async push(item: EventMessage): Promise<void> {\n const data = await this.encodeData(item);\n const serializedData = Buffer.from(data);\n\n // 推送到队列\n await this.redis.rPush(this.queueKey, serializedData);\n\n // 设置队列 TTL 为 300 秒\n await this.redis.expire(this.queueKey, this.ttl);\n\n // 发布到频道通知有新数据\n await this.redis.publish(this.channelKey, serializedData);\n\n this.emit('dataChange', data);\n }\n\n /**\n * 异步生成器:支持 for await...of 方式消费队列数据\n */\n async *onDataReceive(): AsyncGenerator<EventMessage, void, unknown> {\n let queue: EventMessage[] = [];\n let pendingResolve: (() => void) | null = null;\n let isStreamEnded = false;\n const handleMessage = async (message: string) => {\n const data = (await this.decodeData(message)) as EventMessage;\n queue.push(data);\n // 检查是否为流结束或错误信号\n if (\n data.event === '__stream_end__' ||\n data.event === '__stream_error__' ||\n data.event === '__stream_cancel__'\n ) {\n setTimeout(() => {\n isStreamEnded = true;\n if (pendingResolve) {\n pendingResolve();\n pendingResolve = null;\n }\n }, 300);\n\n if (data.event === '__stream_cancel__') {\n this.cancel();\n }\n }\n\n if (pendingResolve) {\n pendingResolve();\n pendingResolve = null;\n }\n };\n\n // 订阅 Redis 频道\n await this.subscriberRedis.subscribe(this.channelKey, (message) => {\n handleMessage(message);\n });\n\n try {\n while (!isStreamEnded) {\n if (queue.length > 0) {\n for (const item of queue) {\n yield item;\n }\n queue = [];\n } else {\n await new Promise((resolve) => {\n pendingResolve = resolve as () => void;\n });\n }\n }\n } finally {\n await this.subscriberRedis.unsubscribe(this.channelKey);\n }\n }\n\n /**\n * 获取队列中的所有数据\n */\n async getAll(): Promise<EventMessage[]> {\n const data = await this.redis.lRange(this.queueKey, 0, -1);\n\n if (!data || data.length === 0) {\n return [];\n }\n\n if (this.compressMessages) {\n return (await Promise.all(\n data.map((item: string) => {\n return this.decodeData(item);\n }),\n )) as EventMessage[];\n } else {\n return data.map((item: string) => JSON.parse(item) as EventMessage);\n }\n }\n\n /**\n * 清空队列\n */\n clear(): void {\n if (this.isConnected) {\n this.redis.del(this.queueKey);\n }\n }\n\n /**\n * 取消操作\n */\n cancel(): void {\n this.push(new CancelEventMessage());\n this.cancelSignal.abort('user cancel this run');\n }\n async copyToQueue(toId: string, ttl?: number): Promise<RedisStreamQueue> {\n const queue = new RedisStreamQueue(toId, this.compressMessages, ttl ?? this.ttl);\n await this.redis.copy(this.queueKey, queue.queueKey);\n await this.redis.expire(queue.queueKey, ttl ?? this.ttl);\n return queue;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { handleRequest } from './adapter/fetch/index.js';
|
|
2
2
|
|
|
3
3
|
function extractContext(req) {
|
|
4
4
|
const langgraphContextHeader = req.headers.get("x-langgraph-context");
|
|
@@ -27,4 +27,4 @@ async function DELETE(req) {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
export { DELETE, GET, POST };
|
|
30
|
-
//# sourceMappingURL=router-
|
|
30
|
+
//# sourceMappingURL=router-DOW8vigV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-
|
|
1
|
+
{"version":3,"file":"router-DOW8vigV.js","sources":["../src/adapter/nextjs/router.ts"],"sourcesContent":["/** @ts-ignore */\nimport { NextRequest } from 'next/server';\nimport { handleRequest } from '../fetch';\n\n/**\n * 从 NextRequest 提取 langgraph context\n */\nfunction extractContext(req: NextRequest) {\n const langgraphContextHeader = req.headers.get('x-langgraph-context');\n if (langgraphContextHeader) {\n try {\n return {\n langgraph_context: JSON.parse(decodeURIComponent(langgraphContextHeader)),\n };\n } catch (error) {\n console.error('Failed to parse x-langgraph-context header:', error);\n }\n }\n return {};\n}\n\n// 统一路由处理器\nexport async function GET(req: NextRequest) {\n const context = extractContext(req);\n return await handleRequest(req, context);\n}\n\nexport async function POST(req: NextRequest) {\n const context = extractContext(req);\n return await handleRequest(req, context);\n}\n\nexport async function DELETE(req: NextRequest) {\n const context = extractContext(req);\n return await handleRequest(req, context);\n}\n"],"names":[],"mappings":";;AAOA,SAAS,eAAe,GAAA,EAAkB;AACtC,EAAA,MAAM,sBAAA,GAAyB,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA;AACpE,EAAA,IAAI,sBAAA,EAAwB;AACxB,IAAA,IAAI;AACA,MAAA,OAAO;AAAA,QACH,iBAAA,EAAmB,IAAA,CAAK,KAAA,CAAM,kBAAA,CAAmB,sBAAsB,CAAC;AAAA,OAC5E;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,+CAA+C,KAAK,CAAA;AAAA,IACtE;AAAA,EACJ;AACA,EAAA,OAAO,EAAC;AACZ;AAGA,eAAsB,IAAI,GAAA,EAAkB;AACxC,EAAA,MAAM,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,EAAA,OAAO,MAAM,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AAC3C;AAEA,eAAsB,KAAK,GAAA,EAAkB;AACzC,EAAA,MAAM,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,EAAA,OAAO,MAAM,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AAC3C;AAEA,eAAsB,OAAO,GAAA,EAAkB;AAC3C,EAAA,MAAM,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,EAAA,OAAO,MAAM,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AAC3C;;;;"}
|
|
@@ -7,15 +7,18 @@ import { RedisClientType } from 'redis';
|
|
|
7
7
|
*/
|
|
8
8
|
export declare class RedisStreamQueue extends BaseStreamQueue implements BaseStreamQueueInterface {
|
|
9
9
|
readonly id: string;
|
|
10
|
+
readonly compressMessages: boolean;
|
|
11
|
+
readonly ttl: number;
|
|
10
12
|
static redis: RedisClientType;
|
|
11
13
|
static subscriberRedis: RedisClientType;
|
|
14
|
+
static isQueueExist(id: string): Promise<boolean>;
|
|
12
15
|
private redis;
|
|
13
16
|
private subscriberRedis;
|
|
14
17
|
private queueKey;
|
|
15
18
|
private channelKey;
|
|
16
19
|
private isConnected;
|
|
17
20
|
cancelSignal: AbortController;
|
|
18
|
-
constructor(id?:
|
|
21
|
+
constructor(id: string, compressMessages?: boolean, ttl?: number);
|
|
19
22
|
/**
|
|
20
23
|
* 推送消息到 Redis 队列
|
|
21
24
|
*/
|
|
@@ -36,4 +39,5 @@ export declare class RedisStreamQueue extends BaseStreamQueue implements BaseStr
|
|
|
36
39
|
* 取消操作
|
|
37
40
|
*/
|
|
38
41
|
cancel(): void;
|
|
42
|
+
copyToQueue(toId: string, ttl?: number): Promise<RedisStreamQueue>;
|
|
39
43
|
}
|
|
@@ -238,10 +238,11 @@ class BaseStreamQueue extends EventEmitter {
|
|
|
238
238
|
* Constructor
|
|
239
239
|
* @param compressMessages 是否压缩消息 / Whether to compress messages
|
|
240
240
|
*/
|
|
241
|
-
constructor(id, compressMessages = true) {
|
|
241
|
+
constructor(id, compressMessages = true, ttl = 300) {
|
|
242
242
|
super();
|
|
243
243
|
this.id = id;
|
|
244
244
|
this.compressMessages = compressMessages;
|
|
245
|
+
this.ttl = ttl;
|
|
245
246
|
}
|
|
246
247
|
/** 序列化器实例 / Serializer instance */
|
|
247
248
|
serializer = new JsonPlusSerializer();
|
|
@@ -290,9 +291,8 @@ class StreamQueueManager {
|
|
|
290
291
|
* @param compressMessages 是否压缩消息 / Whether to compress messages
|
|
291
292
|
* @returns 创建的队列实例 / Created queue instance
|
|
292
293
|
*/
|
|
293
|
-
createQueue(id,
|
|
294
|
-
|
|
295
|
-
this.queues.set(id, new this.queueConstructor(id));
|
|
294
|
+
createQueue(id, ttl = 300) {
|
|
295
|
+
this.queues.set(id, new this.queueConstructor(id, this.defaultCompressMessages, ttl));
|
|
296
296
|
return this.queues.get(id);
|
|
297
297
|
}
|
|
298
298
|
/**
|
|
@@ -302,10 +302,14 @@ class StreamQueueManager {
|
|
|
302
302
|
* @param compressMessages 是否压缩消息,默认为构造函数中的默认值 / Whether to compress messages, defaults to constructor default
|
|
303
303
|
* @returns StreamQueue 实例 / StreamQueue instance
|
|
304
304
|
*/
|
|
305
|
-
getQueue(id) {
|
|
305
|
+
async getQueue(id) {
|
|
306
306
|
const queue = this.queues.get(id);
|
|
307
307
|
if (!queue) {
|
|
308
|
-
|
|
308
|
+
if (await this.queueConstructor?.isQueueExist?.(id)) {
|
|
309
|
+
return this.createQueue(id);
|
|
310
|
+
} else {
|
|
311
|
+
throw new Error(`Queue with id '${id}' does not exist`);
|
|
312
|
+
}
|
|
309
313
|
}
|
|
310
314
|
return queue;
|
|
311
315
|
}
|
|
@@ -326,10 +330,9 @@ class StreamQueueManager {
|
|
|
326
330
|
* Push data to queue with specified id
|
|
327
331
|
* @param id 队列 ID / Queue ID
|
|
328
332
|
* @param item 要推送的数据项 / Item to push
|
|
329
|
-
* @param compressMessages 是否压缩消息,默认为构造函数中的默认值 / Whether to compress messages, defaults to constructor default
|
|
330
333
|
*/
|
|
331
|
-
async pushToQueue(id, item
|
|
332
|
-
const queue = this.getQueue(id);
|
|
334
|
+
async pushToQueue(id, item) {
|
|
335
|
+
const queue = await this.getQueue(id);
|
|
333
336
|
await queue.push(item);
|
|
334
337
|
}
|
|
335
338
|
/**
|
|
@@ -396,6 +399,19 @@ class StreamQueueManager {
|
|
|
396
399
|
queue.clear();
|
|
397
400
|
}
|
|
398
401
|
}
|
|
402
|
+
/**
|
|
403
|
+
* 复制队列数据
|
|
404
|
+
* Copy queue data
|
|
405
|
+
* @param fromId 源队列 ID / Source queue ID
|
|
406
|
+
* @param toId 目标队列 ID / Target queue ID
|
|
407
|
+
* @param ttl 生存时间(毫秒),在指定时间后删除目标队列 / Time to live (milliseconds), remove target queue after specified time
|
|
408
|
+
*/
|
|
409
|
+
async copyQueue(fromId, toId, ttl) {
|
|
410
|
+
const sourceQueue = await this.getQueue(fromId);
|
|
411
|
+
const queue = await sourceQueue.copyToQueue(toId, ttl);
|
|
412
|
+
this.queues.set(toId, queue);
|
|
413
|
+
return queue;
|
|
414
|
+
}
|
|
399
415
|
}
|
|
400
416
|
|
|
401
417
|
const GRAPHS = {};
|
|
@@ -721,6 +737,12 @@ class MemoryStreamQueue extends BaseStreamQueue {
|
|
|
721
737
|
this.push(new CancelEventMessage());
|
|
722
738
|
this.cancelSignal.abort("user cancel this run");
|
|
723
739
|
}
|
|
740
|
+
async copyToQueue(toId, ttl) {
|
|
741
|
+
const data = this.data;
|
|
742
|
+
const queue = new MemoryStreamQueue(toId, this.compressMessages, ttl ?? this.ttl);
|
|
743
|
+
queue.data = data;
|
|
744
|
+
return queue;
|
|
745
|
+
}
|
|
724
746
|
}
|
|
725
747
|
|
|
726
748
|
class MemoryThreadsManager {
|
|
@@ -917,7 +939,7 @@ const createMessageQueue = async () => {
|
|
|
917
939
|
let q;
|
|
918
940
|
if (process.env.REDIS_URL) {
|
|
919
941
|
console.debug("LG | Using redis as stream queue");
|
|
920
|
-
const { RedisStreamQueue } = await import('./queue-
|
|
942
|
+
const { RedisStreamQueue } = await import('./queue-kaJOJdKs.js');
|
|
921
943
|
q = RedisStreamQueue;
|
|
922
944
|
} else {
|
|
923
945
|
q = MemoryStreamQueue;
|
|
@@ -1039,6 +1061,7 @@ async function streamStateWithQueue(threads, run, queue, payload, options) {
|
|
|
1039
1061
|
if (getNameWithNs("values") === "values") {
|
|
1040
1062
|
if (value?.__interrupt__) {
|
|
1041
1063
|
await threads.set(run.thread_id, {
|
|
1064
|
+
status: "interrupted",
|
|
1042
1065
|
interrupts: value ? JSON.parse(serialiseAsDict(value)) : ""
|
|
1043
1066
|
});
|
|
1044
1067
|
} else {
|
|
@@ -1114,10 +1137,15 @@ async function* streamState(threads, run, payload, options) {
|
|
|
1114
1137
|
await threads.updateRun(run.run_id, { status: "error" });
|
|
1115
1138
|
await threads.set(threadId, { status: "error" });
|
|
1116
1139
|
} finally {
|
|
1117
|
-
await threads.
|
|
1140
|
+
const nowState = await threads.get(threadId);
|
|
1141
|
+
if (nowState.status === "interrupted") {
|
|
1142
|
+
await LangGraphGlobal.globalMessageQueue.copyQueue(queueId, threadId, 3e4);
|
|
1143
|
+
} else {
|
|
1144
|
+
await threads.set(threadId, { status: "idle", interrupts: {} });
|
|
1145
|
+
}
|
|
1118
1146
|
LangGraphGlobal.globalMessageQueue.removeQueue(queueId);
|
|
1119
1147
|
}
|
|
1120
1148
|
}
|
|
1121
1149
|
|
|
1122
1150
|
export { BaseStreamQueue as B, CancelEventMessage as C, GRAPHS as G, LangGraphGlobal as L, streamState as a, getGraph as g, registerGraph as r, serialiseAsDict as s };
|
|
1123
|
-
//# sourceMappingURL=stream-
|
|
1151
|
+
//# sourceMappingURL=stream-BkrtqGvX.js.map
|