@langgraph-js/pure-graph 2.5.2 → 2.7.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/README.md +183 -15
- package/dist/adapter/fetch/assistants.d.ts +9 -0
- package/dist/adapter/fetch/context.d.ts +4 -0
- package/dist/adapter/fetch/index.d.ts +8 -0
- package/dist/adapter/fetch/runs.d.ts +21 -0
- package/dist/adapter/fetch/threads.d.ts +17 -0
- package/dist/adapter/fetch/utils.d.ts +44 -0
- package/dist/adapter/hono/index.js +7 -209
- package/dist/adapter/hono/index.js.map +1 -1
- package/dist/adapter/nextjs/index.js +2 -2
- package/dist/adapter/nextjs/router.d.ts +3 -3
- package/dist/{checkpoint-CIPz11az.js → checkpoint-S8bA03zo.js} +11 -7
- package/dist/checkpoint-S8bA03zo.js.map +1 -0
- package/dist/{createEndpoint-B2VS7oft.js → createEndpoint-BEEfOyPg.js} +2 -2
- package/dist/{createEndpoint-B2VS7oft.js.map → createEndpoint-BEEfOyPg.js.map} +1 -1
- package/dist/index-B-gojNlM.js +557 -0
- package/dist/index-B-gojNlM.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/{queue-4hNWpVhz.js → queue-g6fOz7D5.js} +2 -2
- package/dist/{queue-4hNWpVhz.js.map → queue-g6fOz7D5.js.map} +1 -1
- package/dist/router-Dk7saRUW.js +30 -0
- package/dist/router-Dk7saRUW.js.map +1 -0
- package/dist/{stream-CGNawrTA.js → stream-Blquv56P.js} +13 -4
- package/dist/stream-Blquv56P.js.map +1 -0
- package/package.json +4 -3
- package/dist/adapter/hono/assistants.d.ts +0 -3
- package/dist/adapter/hono/runs.d.ts +0 -6
- package/dist/adapter/hono/threads.d.ts +0 -3
- package/dist/adapter/nextjs/endpoint.d.ts +0 -35
- package/dist/checkpoint-CIPz11az.js.map +0 -1
- package/dist/router-BaSAn6qO.js +0 -218
- package/dist/router-BaSAn6qO.js.map +0 -1
- package/dist/stream-CGNawrTA.js.map +0 -1
- package/dist/zod-B6xyK6pu.js +0 -112
- package/dist/zod-B6xyK6pu.js.map +0 -1
- /package/dist/adapter/{hono → fetch}/endpoint.d.ts +0 -0
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
import { s as serialiseAsDict, L as LangGraphGlobal } from './stream-Blquv56P.js';
|
|
2
|
+
import { c as createEndpoint } from './createEndpoint-BEEfOyPg.js';
|
|
3
|
+
import z from 'zod';
|
|
4
|
+
import camelcaseKeys from 'camelcase-keys';
|
|
5
|
+
|
|
6
|
+
const client = createEndpoint();
|
|
7
|
+
|
|
8
|
+
const AssistantConfigurable = z.object({
|
|
9
|
+
thread_id: z.string().optional(),
|
|
10
|
+
thread_ts: z.string().optional()
|
|
11
|
+
}).catchall(z.unknown());
|
|
12
|
+
const AssistantConfig = z.object({
|
|
13
|
+
tags: z.array(z.string()).optional(),
|
|
14
|
+
recursion_limit: z.number().int().optional(),
|
|
15
|
+
configurable: AssistantConfigurable.optional()
|
|
16
|
+
}).catchall(z.unknown()).describe("The configuration of an assistant.");
|
|
17
|
+
z.object({
|
|
18
|
+
assistant_id: z.string().uuid(),
|
|
19
|
+
graph_id: z.string(),
|
|
20
|
+
config: AssistantConfig,
|
|
21
|
+
created_at: z.string(),
|
|
22
|
+
updated_at: z.string(),
|
|
23
|
+
metadata: z.object({}).catchall(z.any())
|
|
24
|
+
});
|
|
25
|
+
const MetadataSchema = z.object({
|
|
26
|
+
source: z.union([z.literal("input"), z.literal("loop"), z.literal("update"), z.string()]).optional(),
|
|
27
|
+
step: z.number().optional(),
|
|
28
|
+
writes: z.any().nullable().optional(),
|
|
29
|
+
parents: z.any().optional()
|
|
30
|
+
}).catchall(z.unknown());
|
|
31
|
+
const SendSchema = z.object({
|
|
32
|
+
node: z.string(),
|
|
33
|
+
input: z.unknown().optional()
|
|
34
|
+
});
|
|
35
|
+
const CommandSchema = z.object({
|
|
36
|
+
update: z.union([z.any(), z.array(z.tuple([z.string(), z.any()]))]).nullable().optional(),
|
|
37
|
+
resume: z.unknown().optional(),
|
|
38
|
+
goto: z.union([SendSchema, z.array(SendSchema), z.string(), z.array(z.string())]).optional()
|
|
39
|
+
});
|
|
40
|
+
z.object({
|
|
41
|
+
limit: z.number().int().optional(),
|
|
42
|
+
offset: z.number().int().optional()
|
|
43
|
+
});
|
|
44
|
+
const ThreadIdParamSchema = z.object({
|
|
45
|
+
thread_id: z.string().uuid()
|
|
46
|
+
});
|
|
47
|
+
const RunIdParamSchema = z.object({
|
|
48
|
+
thread_id: z.string().uuid(),
|
|
49
|
+
run_id: z.string().uuid()
|
|
50
|
+
});
|
|
51
|
+
const AssistantsSearchSchema = z.object({
|
|
52
|
+
graph_id: z.string().optional(),
|
|
53
|
+
metadata: MetadataSchema.optional(),
|
|
54
|
+
limit: z.number().int().optional(),
|
|
55
|
+
offset: z.number().int().optional()
|
|
56
|
+
});
|
|
57
|
+
const AssistantGraphQuerySchema = z.object({
|
|
58
|
+
xray: z.string().optional()
|
|
59
|
+
});
|
|
60
|
+
const RunStreamPayloadSchema = z.object({
|
|
61
|
+
assistant_id: z.union([z.string().uuid(), z.string()]),
|
|
62
|
+
checkpoint_id: z.string().optional(),
|
|
63
|
+
input: z.any().optional(),
|
|
64
|
+
command: CommandSchema.optional(),
|
|
65
|
+
metadata: MetadataSchema.optional(),
|
|
66
|
+
config: AssistantConfig.optional(),
|
|
67
|
+
webhook: z.string().optional(),
|
|
68
|
+
interrupt_before: z.union([z.literal("*"), z.array(z.string())]).optional(),
|
|
69
|
+
interrupt_after: z.union([z.literal("*"), z.array(z.string())]).optional(),
|
|
70
|
+
on_disconnect: z.enum(["cancel", "continue"]).optional().default("continue"),
|
|
71
|
+
multitask_strategy: z.enum(["reject", "rollback", "interrupt", "enqueue"]).optional(),
|
|
72
|
+
stream_mode: z.array(z.enum(["values", "messages", "messages-tuple", "updates", "events", "debug", "custom"])).optional(),
|
|
73
|
+
stream_subgraphs: z.boolean().optional(),
|
|
74
|
+
stream_resumable: z.boolean().optional(),
|
|
75
|
+
after_seconds: z.number().optional(),
|
|
76
|
+
if_not_exists: z.enum(["create", "reject"]).optional(),
|
|
77
|
+
on_completion: z.enum(["complete", "continue"]).optional(),
|
|
78
|
+
feedback_keys: z.array(z.string()).optional(),
|
|
79
|
+
langsmith_tracer: z.unknown().optional()
|
|
80
|
+
}).describe("Payload for creating a stateful run.");
|
|
81
|
+
const RunListQuerySchema = z.object({
|
|
82
|
+
limit: z.coerce.number().int().optional(),
|
|
83
|
+
offset: z.coerce.number().int().optional(),
|
|
84
|
+
status: z.enum(["pending", "running", "error", "success", "timeout", "interrupted"]).optional()
|
|
85
|
+
});
|
|
86
|
+
const RunCancelQuerySchema = z.object({
|
|
87
|
+
wait: z.coerce.boolean().optional().default(false),
|
|
88
|
+
action: z.enum(["interrupt", "rollback"]).optional().default("interrupt")
|
|
89
|
+
});
|
|
90
|
+
const RunJoinStreamQuerySchema = z.object({
|
|
91
|
+
cancel_on_disconnect: z.coerce.boolean().optional().default(false),
|
|
92
|
+
last_event_id: z.string().optional(),
|
|
93
|
+
stream_mode: z.enum(["values", "messages", "messages-tuple", "updates", "events", "debug", "custom"]).optional()
|
|
94
|
+
});
|
|
95
|
+
const ThreadCreatePayloadSchema = z.object({
|
|
96
|
+
thread_id: z.string().uuid().describe("The ID of the thread. If not provided, an ID is generated.").optional(),
|
|
97
|
+
metadata: MetadataSchema.optional(),
|
|
98
|
+
if_exists: z.union([z.literal("raise"), z.literal("do_nothing")]).optional()
|
|
99
|
+
}).describe("Payload for creating a thread.");
|
|
100
|
+
const ThreadSearchPayloadSchema = z.object({
|
|
101
|
+
metadata: MetadataSchema.describe("Metadata to search for.").optional(),
|
|
102
|
+
status: z.enum(["idle", "busy", "interrupted", "error"]).describe("Filter by thread status.").optional(),
|
|
103
|
+
values: z.any().describe("Filter by thread values.").optional(),
|
|
104
|
+
limit: z.number().int().gte(1).lte(1e3).describe("Maximum number to return.").optional(),
|
|
105
|
+
offset: z.number().int().gte(0).describe("Offset to start from.").optional(),
|
|
106
|
+
sort_by: z.enum(["thread_id", "status", "created_at", "updated_at"]).describe("Sort by field.").optional(),
|
|
107
|
+
sort_order: z.enum(["asc", "desc"]).describe("Sort order.").optional()
|
|
108
|
+
}).describe("Payload for listing threads.");
|
|
109
|
+
const ThreadStateUpdate = z.object({
|
|
110
|
+
values: z.union([z.record(z.string(), z.unknown()), z.array(z.record(z.string(), z.unknown()))]).nullish()
|
|
111
|
+
// as_node: z.string().optional(),
|
|
112
|
+
// checkpoint_id: z.string().optional(),
|
|
113
|
+
// checkpoint: CheckpointSchema.nullish(),
|
|
114
|
+
}).describe("Payload for adding state to a thread.");
|
|
115
|
+
|
|
116
|
+
function parsePathParams(url, pattern) {
|
|
117
|
+
const patternParts = pattern.split("/").filter((p) => p);
|
|
118
|
+
const urlParts = new URL(url).pathname.split("/").filter((p) => p);
|
|
119
|
+
const params = {};
|
|
120
|
+
patternParts.forEach((part, index) => {
|
|
121
|
+
if (part.startsWith(":")) {
|
|
122
|
+
const paramName = part.slice(1);
|
|
123
|
+
params[paramName] = urlParts[index];
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
return params;
|
|
127
|
+
}
|
|
128
|
+
function parseQueryParams(url) {
|
|
129
|
+
const searchParams = new URL(url).searchParams;
|
|
130
|
+
const params = {};
|
|
131
|
+
searchParams.forEach((value, key) => {
|
|
132
|
+
if (!isNaN(Number(value)) && value !== "") {
|
|
133
|
+
params[key] = Number(value);
|
|
134
|
+
} else if (value === "true" || value === "false") {
|
|
135
|
+
params[key] = value === "true";
|
|
136
|
+
} else {
|
|
137
|
+
params[key] = value;
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
return params;
|
|
141
|
+
}
|
|
142
|
+
function validate(schema, data) {
|
|
143
|
+
const result = schema.safeParse(data);
|
|
144
|
+
if (!result.success) {
|
|
145
|
+
throw new ValidationError(result.error.issues);
|
|
146
|
+
}
|
|
147
|
+
return result.data;
|
|
148
|
+
}
|
|
149
|
+
class ValidationError extends Error {
|
|
150
|
+
errors;
|
|
151
|
+
constructor(errors) {
|
|
152
|
+
super("Validation failed");
|
|
153
|
+
this.name = "ValidationError";
|
|
154
|
+
this.errors = errors;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function jsonResponse(data, status = 200, headers) {
|
|
158
|
+
return new Response(JSON.stringify(data), {
|
|
159
|
+
status,
|
|
160
|
+
headers: {
|
|
161
|
+
"Content-Type": "application/json",
|
|
162
|
+
...headers
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
function errorResponse(error, status = 500) {
|
|
167
|
+
if (error instanceof ValidationError) {
|
|
168
|
+
return jsonResponse(
|
|
169
|
+
{
|
|
170
|
+
error: "Validation Error",
|
|
171
|
+
details: error.errors
|
|
172
|
+
},
|
|
173
|
+
400
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
return jsonResponse(
|
|
177
|
+
{
|
|
178
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
179
|
+
},
|
|
180
|
+
status
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
function createSSEStream(streamFn) {
|
|
184
|
+
let controller;
|
|
185
|
+
let isClosed = false;
|
|
186
|
+
const stream = new ReadableStream({
|
|
187
|
+
async start(ctrl) {
|
|
188
|
+
controller = ctrl;
|
|
189
|
+
const encoder = new TextEncoder();
|
|
190
|
+
const writer = {
|
|
191
|
+
writeSSE: async ({ data, event, id }) => {
|
|
192
|
+
if (isClosed) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
let message = "";
|
|
197
|
+
if (id) {
|
|
198
|
+
message += `id: ${id}
|
|
199
|
+
`;
|
|
200
|
+
}
|
|
201
|
+
if (event) {
|
|
202
|
+
message += `event: ${event}
|
|
203
|
+
`;
|
|
204
|
+
}
|
|
205
|
+
message += `data: ${data}
|
|
206
|
+
|
|
207
|
+
`;
|
|
208
|
+
controller.enqueue(encoder.encode(message));
|
|
209
|
+
} catch (error) {
|
|
210
|
+
if (!isClosed) {
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
close: () => {
|
|
216
|
+
if (!isClosed) {
|
|
217
|
+
isClosed = true;
|
|
218
|
+
try {
|
|
219
|
+
controller.close();
|
|
220
|
+
} catch (error) {
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
try {
|
|
226
|
+
await streamFn(writer);
|
|
227
|
+
} catch (error) {
|
|
228
|
+
console.error("SSE stream error:", error);
|
|
229
|
+
} finally {
|
|
230
|
+
if (!isClosed) {
|
|
231
|
+
isClosed = true;
|
|
232
|
+
try {
|
|
233
|
+
controller.close();
|
|
234
|
+
} catch (error) {
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
cancel() {
|
|
240
|
+
isClosed = true;
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
return new Response(stream, {
|
|
244
|
+
headers: {
|
|
245
|
+
"Content-Type": "text/event-stream",
|
|
246
|
+
"Cache-Control": "no-cache",
|
|
247
|
+
Connection: "keep-alive"
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
function withHeartbeat(streamFn, heartbeatInterval = process.env.HEARTBEAT_INTERVAL ? parseInt(process.env.HEARTBEAT_INTERVAL) : 1500) {
|
|
252
|
+
return async (writer) => {
|
|
253
|
+
let heartbeatTimer = null;
|
|
254
|
+
const startHeartbeat = () => {
|
|
255
|
+
if (heartbeatTimer) {
|
|
256
|
+
clearInterval(heartbeatTimer);
|
|
257
|
+
}
|
|
258
|
+
heartbeatTimer = setInterval(async () => {
|
|
259
|
+
try {
|
|
260
|
+
await writer.writeSSE({ event: "ping", data: "{}" });
|
|
261
|
+
} catch (error) {
|
|
262
|
+
if (heartbeatTimer) {
|
|
263
|
+
clearInterval(heartbeatTimer);
|
|
264
|
+
heartbeatTimer = null;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}, heartbeatInterval);
|
|
268
|
+
};
|
|
269
|
+
const stopHeartbeat = () => {
|
|
270
|
+
if (heartbeatTimer) {
|
|
271
|
+
clearInterval(heartbeatTimer);
|
|
272
|
+
heartbeatTimer = null;
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
const proxiedWriter = {
|
|
276
|
+
writeSSE: async (data) => {
|
|
277
|
+
stopHeartbeat();
|
|
278
|
+
await writer.writeSSE(data);
|
|
279
|
+
startHeartbeat();
|
|
280
|
+
},
|
|
281
|
+
close: () => {
|
|
282
|
+
stopHeartbeat();
|
|
283
|
+
writer.close();
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
startHeartbeat();
|
|
287
|
+
try {
|
|
288
|
+
await streamFn(proxiedWriter);
|
|
289
|
+
} finally {
|
|
290
|
+
stopHeartbeat();
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
async function searchAssistants(req, context) {
|
|
296
|
+
try {
|
|
297
|
+
const body = await req.json();
|
|
298
|
+
const payload = validate(AssistantsSearchSchema, body);
|
|
299
|
+
const data = await client.assistants.search(camelcaseKeys(payload));
|
|
300
|
+
return jsonResponse(data, 200, {
|
|
301
|
+
"X-Pagination-Total": "0"
|
|
302
|
+
});
|
|
303
|
+
} catch (error) {
|
|
304
|
+
return errorResponse(error);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
async function getAssistantGraph(req, context) {
|
|
308
|
+
try {
|
|
309
|
+
const url = new URL(req.url);
|
|
310
|
+
const pathParts = url.pathname.split("/").filter((p) => p);
|
|
311
|
+
const assistant_id = pathParts[1];
|
|
312
|
+
const queryParams = parseQueryParams(req.url);
|
|
313
|
+
const { xray } = validate(AssistantGraphQuerySchema, queryParams);
|
|
314
|
+
const data = await client.assistants.getGraph(assistant_id, {
|
|
315
|
+
xray: xray !== void 0 ? xray === "true" : void 0
|
|
316
|
+
});
|
|
317
|
+
return jsonResponse(data);
|
|
318
|
+
} catch (error) {
|
|
319
|
+
return errorResponse(error);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
async function createThread(req, context) {
|
|
324
|
+
try {
|
|
325
|
+
const body = await req.json();
|
|
326
|
+
const payload = validate(ThreadCreatePayloadSchema, body);
|
|
327
|
+
const thread = await client.threads.create(camelcaseKeys(payload));
|
|
328
|
+
return jsonResponse(thread);
|
|
329
|
+
} catch (error) {
|
|
330
|
+
return errorResponse(error);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async function searchThreads(req, context) {
|
|
334
|
+
try {
|
|
335
|
+
const body = await req.json();
|
|
336
|
+
const payload = validate(ThreadSearchPayloadSchema, body);
|
|
337
|
+
const result = await client.threads.search(camelcaseKeys(payload));
|
|
338
|
+
return jsonResponse(result, 200, {
|
|
339
|
+
"X-Pagination-Total": result.length.toString()
|
|
340
|
+
});
|
|
341
|
+
} catch (error) {
|
|
342
|
+
return errorResponse(error);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
async function getThread(req, context) {
|
|
346
|
+
try {
|
|
347
|
+
const params = parsePathParams(req.url, "/threads/:thread_id");
|
|
348
|
+
const { thread_id } = validate(ThreadIdParamSchema, params);
|
|
349
|
+
const thread = await client.threads.get(thread_id);
|
|
350
|
+
return jsonResponse(thread);
|
|
351
|
+
} catch (error) {
|
|
352
|
+
return errorResponse(error);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
async function deleteThread(req, context) {
|
|
356
|
+
try {
|
|
357
|
+
const params = parsePathParams(req.url, "/threads/:thread_id");
|
|
358
|
+
const { thread_id } = validate(ThreadIdParamSchema, params);
|
|
359
|
+
await client.threads.delete(thread_id);
|
|
360
|
+
return new Response(null, { status: 204 });
|
|
361
|
+
} catch (error) {
|
|
362
|
+
return errorResponse(error);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
async function streamRun(req, context) {
|
|
367
|
+
try {
|
|
368
|
+
const params = parsePathParams(req.url, "/threads/:thread_id/runs/stream");
|
|
369
|
+
const { thread_id } = validate(ThreadIdParamSchema, params);
|
|
370
|
+
const body = await req.json();
|
|
371
|
+
const payload = validate(RunStreamPayloadSchema, body);
|
|
372
|
+
return createSSEStream(
|
|
373
|
+
withHeartbeat(async (writer) => {
|
|
374
|
+
payload.config = payload.config || {};
|
|
375
|
+
payload.config.configurable = payload.config.configurable || {};
|
|
376
|
+
const langgraphContext = context?.langgraph_context;
|
|
377
|
+
if (langgraphContext) {
|
|
378
|
+
Object.assign(payload.config.configurable, langgraphContext);
|
|
379
|
+
}
|
|
380
|
+
for await (const { event, data } of client.runs.stream(
|
|
381
|
+
thread_id,
|
|
382
|
+
payload.assistant_id,
|
|
383
|
+
camelcaseKeys(payload)
|
|
384
|
+
)) {
|
|
385
|
+
await writer.writeSSE({ data: serialiseAsDict(data) ?? "", event });
|
|
386
|
+
}
|
|
387
|
+
})
|
|
388
|
+
);
|
|
389
|
+
} catch (error) {
|
|
390
|
+
return errorResponse(error);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
async function joinRunStream(req, context) {
|
|
394
|
+
try {
|
|
395
|
+
const params = parsePathParams(req.url, "/threads/:thread_id/runs/:run_id/stream");
|
|
396
|
+
const { thread_id, run_id } = validate(RunIdParamSchema, params);
|
|
397
|
+
const queryParams = parseQueryParams(req.url);
|
|
398
|
+
const { cancel_on_disconnect, last_event_id, stream_mode } = validate(RunJoinStreamQuerySchema, queryParams);
|
|
399
|
+
return createSSEStream(
|
|
400
|
+
withHeartbeat(async (writer) => {
|
|
401
|
+
const controller = new AbortController();
|
|
402
|
+
if (cancel_on_disconnect) {
|
|
403
|
+
const cleanup = () => {
|
|
404
|
+
controller.abort("Client disconnected");
|
|
405
|
+
};
|
|
406
|
+
req.signal?.addEventListener("abort", cleanup);
|
|
407
|
+
}
|
|
408
|
+
try {
|
|
409
|
+
for await (const { event, data, id } of client.runs.joinStream(thread_id, run_id, {
|
|
410
|
+
signal: controller.signal,
|
|
411
|
+
cancelOnDisconnect: cancel_on_disconnect,
|
|
412
|
+
lastEventId: last_event_id,
|
|
413
|
+
streamMode: stream_mode ? [stream_mode] : void 0
|
|
414
|
+
})) {
|
|
415
|
+
await writer.writeSSE({
|
|
416
|
+
data: serialiseAsDict(data) ?? "",
|
|
417
|
+
event,
|
|
418
|
+
id
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
} catch (error) {
|
|
422
|
+
if (!(error instanceof Error) || !error.message.includes("user cancel")) {
|
|
423
|
+
console.error("Join stream error:", error);
|
|
424
|
+
await writer.writeSSE({
|
|
425
|
+
event: "error",
|
|
426
|
+
data: JSON.stringify({
|
|
427
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
428
|
+
})
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
})
|
|
433
|
+
);
|
|
434
|
+
} catch (error) {
|
|
435
|
+
return errorResponse(error);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
async function listRuns(req, context) {
|
|
439
|
+
try {
|
|
440
|
+
const params = parsePathParams(req.url, "/threads/:thread_id/runs");
|
|
441
|
+
const { thread_id } = validate(ThreadIdParamSchema, params);
|
|
442
|
+
const queryParams = parseQueryParams(req.url);
|
|
443
|
+
const { limit, offset, status } = validate(RunListQuerySchema, queryParams);
|
|
444
|
+
const runs = await client.runs.list(thread_id, { limit, offset, status });
|
|
445
|
+
return jsonResponse(runs);
|
|
446
|
+
} catch (error) {
|
|
447
|
+
return errorResponse(error);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
async function cancelRun(req, context) {
|
|
451
|
+
try {
|
|
452
|
+
const params = parsePathParams(req.url, "/threads/:thread_id/runs/:run_id/cancel");
|
|
453
|
+
const { thread_id, run_id } = validate(RunIdParamSchema, params);
|
|
454
|
+
const queryParams = parseQueryParams(req.url);
|
|
455
|
+
const { wait, action } = validate(RunCancelQuerySchema, queryParams);
|
|
456
|
+
const cancel = client.runs.cancel(thread_id, run_id, wait, action);
|
|
457
|
+
if (wait) {
|
|
458
|
+
await cancel;
|
|
459
|
+
}
|
|
460
|
+
return new Response(null, { status: wait ? 204 : 202 });
|
|
461
|
+
} catch (error) {
|
|
462
|
+
return errorResponse(error);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
async function updateThreadState(req, context) {
|
|
466
|
+
try {
|
|
467
|
+
const params = parsePathParams(req.url, "/threads/:thread_id/state");
|
|
468
|
+
const { thread_id } = validate(z.object({ thread_id: z.string().uuid() }), params);
|
|
469
|
+
const body = await req.json();
|
|
470
|
+
const payload = validate(ThreadStateUpdate, body);
|
|
471
|
+
const inserted = await client.threads.updateState(thread_id, payload);
|
|
472
|
+
return jsonResponse(inserted);
|
|
473
|
+
} catch (error) {
|
|
474
|
+
return errorResponse(error);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
const routes = [
|
|
479
|
+
// Assistants
|
|
480
|
+
{
|
|
481
|
+
method: "POST",
|
|
482
|
+
pattern: /^\/assistants\/search$/,
|
|
483
|
+
handler: searchAssistants
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
method: "GET",
|
|
487
|
+
pattern: /^\/assistants\/[^/]+\/graph$/,
|
|
488
|
+
handler: getAssistantGraph
|
|
489
|
+
},
|
|
490
|
+
// Threads
|
|
491
|
+
{
|
|
492
|
+
method: "POST",
|
|
493
|
+
pattern: /^\/threads$/,
|
|
494
|
+
handler: createThread
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
method: "POST",
|
|
498
|
+
pattern: /^\/threads\/search$/,
|
|
499
|
+
handler: searchThreads
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
method: "GET",
|
|
503
|
+
pattern: /^\/threads\/[^/]+$/,
|
|
504
|
+
handler: getThread
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
method: "DELETE",
|
|
508
|
+
pattern: /^\/threads\/[^/]+$/,
|
|
509
|
+
handler: deleteThread
|
|
510
|
+
},
|
|
511
|
+
// Runs
|
|
512
|
+
{
|
|
513
|
+
method: "POST",
|
|
514
|
+
pattern: /^\/threads\/[^/]+\/runs\/stream$/,
|
|
515
|
+
handler: streamRun
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
method: "GET",
|
|
519
|
+
pattern: /^\/threads\/[^/]+\/runs\/[^/]+\/stream$/,
|
|
520
|
+
handler: joinRunStream
|
|
521
|
+
},
|
|
522
|
+
{
|
|
523
|
+
method: "GET",
|
|
524
|
+
pattern: /^\/threads\/[^/]+\/runs$/,
|
|
525
|
+
handler: listRuns
|
|
526
|
+
},
|
|
527
|
+
{
|
|
528
|
+
method: "POST",
|
|
529
|
+
pattern: /^\/threads\/[^/]+\/runs\/[^/]+\/cancel$/,
|
|
530
|
+
handler: cancelRun
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
method: "POST",
|
|
534
|
+
pattern: /^\/threads\/[^/]+\/state$/,
|
|
535
|
+
handler: updateThreadState
|
|
536
|
+
}
|
|
537
|
+
];
|
|
538
|
+
async function handleRequest(req, context = {}) {
|
|
539
|
+
try {
|
|
540
|
+
await LangGraphGlobal.initGlobal();
|
|
541
|
+
const url = new URL(req.url);
|
|
542
|
+
const pathname = url.pathname;
|
|
543
|
+
const method = req.method;
|
|
544
|
+
for (const route of routes) {
|
|
545
|
+
if (route.method === method && route.pattern.test(pathname)) {
|
|
546
|
+
return await route.handler(req, context);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
return new Response("Not Found", { status: 404 });
|
|
550
|
+
} catch (error) {
|
|
551
|
+
console.error("Request error:", error);
|
|
552
|
+
return errorResponse(error);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
export { handleRequest as h };
|
|
557
|
+
//# sourceMappingURL=index-B-gojNlM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-B-gojNlM.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(),\n offset: z.coerce.number().int().optional(),\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 })\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\n/**\n * 主路由处理器\n */\nexport async function handleRequest(req: Request, context: LangGraphServerContext = {}): Promise<Response> {\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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"}
|
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-BEEfOyPg.js';
|
|
2
|
+
export { L as LangGraphGlobal, r as registerGraph } from './stream-Blquv56P.js';
|
|
3
3
|
import { StateGraph, entrypoint, getPreviousState, getConfig } from '@langchain/langgraph';
|
|
4
4
|
import { schemaMetaRegistry } from '@langchain/langgraph/zod';
|
|
5
5
|
|