@langgraph-js/pure-graph 1.4.6 → 1.5.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 +233 -8
- package/dist/adapter/hono/index.d.ts +6 -1
- package/dist/adapter/hono/index.js +7 -1
- package/dist/adapter/hono/index.js.map +1 -1
- package/dist/adapter/hono/runs.d.ts +4 -1
- package/dist/adapter/nextjs/index.d.ts +27 -1
- package/dist/adapter/nextjs/index.js +12 -170
- package/dist/adapter/nextjs/index.js.map +1 -1
- package/dist/{createEndpoint-B0FQz0jr.js → createEndpoint-D56l-tDn.js} +10 -10
- package/dist/createEndpoint-D56l-tDn.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/{queue-Cao_-0hm.js → queue-BnmSDnCz.js} +2 -2
- package/dist/{queue-Cao_-0hm.js.map → queue-BnmSDnCz.js.map} +1 -1
- package/dist/router-BbUgLFyh.js +183 -0
- package/dist/router-BbUgLFyh.js.map +1 -0
- package/package.json +1 -1
- package/dist/createEndpoint-B0FQz0jr.js.map +0 -1
package/README.md
CHANGED
|
@@ -54,13 +54,39 @@ To integrate Pure Graph into a Next.js project, follow these steps:
|
|
|
54
54
|
|
|
55
55
|
```js
|
|
56
56
|
// app/api/langgraph/[...path]/route.ts
|
|
57
|
-
import {
|
|
58
|
-
import {
|
|
59
|
-
|
|
57
|
+
import { NextRequest } from 'next/server';
|
|
58
|
+
import { ensureInitialized } from '@langgraph-js/pure-graph/dist/adapter/nextjs/index';
|
|
59
|
+
export const dynamic = 'force-dynamic';
|
|
60
|
+
export const revalidate = 0;
|
|
61
|
+
|
|
62
|
+
const registerGraph = async () => {
|
|
63
|
+
// You must separate graph registration and the router file to avoid Next.js loading the graph multiple times.
|
|
64
|
+
// 必须分开写注册图和 router 文件,以避免 nextjs 多次加载的问题
|
|
65
|
+
await import('@/agent/index');
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const GET = async (req: NextRequest, context: any) => {
|
|
69
|
+
const { GET } = await ensureInitialized(registerGraph);
|
|
70
|
+
return GET(req);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export const POST = async (req: NextRequest, context: any) => {
|
|
74
|
+
const { POST } = await ensureInitialized(registerGraph);
|
|
75
|
+
return POST(req);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export const DELETE = async (req: NextRequest, context: any) => {
|
|
79
|
+
const { DELETE } = await ensureInitialized(registerGraph);
|
|
80
|
+
return DELETE(req);
|
|
81
|
+
};
|
|
82
|
+
```
|
|
60
83
|
|
|
84
|
+
```ts
|
|
85
|
+
// @/agent/index.ts
|
|
86
|
+
import { registerGraph } from '@langgraph-js/pure-graph';
|
|
87
|
+
import graph from 'you-langgraph-graph';
|
|
61
88
|
registerGraph('test', graph);
|
|
62
|
-
|
|
63
|
-
export { GET, POST, DELETE };
|
|
89
|
+
export {};
|
|
64
90
|
```
|
|
65
91
|
|
|
66
92
|
2. **Configure Environment Variables**
|
|
@@ -86,17 +112,71 @@ To integrate Pure Graph into a Hono.js project, follow these steps:
|
|
|
86
112
|
import { registerGraph } from '@langgraph-js/pure-graph';
|
|
87
113
|
import { graph } from './agent/graph-name/graph';
|
|
88
114
|
import { Hono } from 'hono';
|
|
89
|
-
import LangGraphApp from '@langgraph-js/pure-graph/dist/adapter/hono/index';
|
|
115
|
+
import LangGraphApp, { type LangGraphServerContext } from '@langgraph-js/pure-graph/dist/adapter/hono/index';
|
|
90
116
|
|
|
91
117
|
registerGraph('test', graph);
|
|
92
118
|
|
|
93
|
-
const app = new Hono();
|
|
119
|
+
const app = new Hono<{ Variables: LangGraphServerContext }>();
|
|
120
|
+
|
|
94
121
|
app.route('/', LangGraphApp);
|
|
95
122
|
|
|
96
123
|
export default app;
|
|
97
124
|
```
|
|
98
125
|
|
|
99
|
-
2. **
|
|
126
|
+
2. **Using LangGraph Entrypoint (Recommended)**
|
|
127
|
+
|
|
128
|
+
For more advanced use cases, you can use LangGraph's `entrypoint` function to create reusable workflows:
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
// agent/entrypoint-graph.ts
|
|
132
|
+
import { Annotation, entrypoint, getConfig } from '@langchain/langgraph';
|
|
133
|
+
import { createReactAgent, createReactAgentAnnotation } from '@langchain/langgraph/prebuilt';
|
|
134
|
+
import { createState } from '@langgraph-js/pro';
|
|
135
|
+
import { createEntrypointGraph } from '@langgraph-js/pure-graph';
|
|
136
|
+
import { ChatOpenAI } from '@langchain/openai';
|
|
137
|
+
|
|
138
|
+
const State = createState(createReactAgentAnnotation()).build({});
|
|
139
|
+
|
|
140
|
+
const workflow = entrypoint('my-entrypoint', async (state: typeof State.State) => {
|
|
141
|
+
// Access context set by middleware
|
|
142
|
+
const config = getConfig();
|
|
143
|
+
console.log('User ID from context:', config.configurable?.userId);
|
|
144
|
+
|
|
145
|
+
const agent = createReactAgent({
|
|
146
|
+
llm: new ChatOpenAI({
|
|
147
|
+
model: 'your-model',
|
|
148
|
+
}),
|
|
149
|
+
prompt: 'You are a helpful assistant',
|
|
150
|
+
tools: [], // Add your tools here
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
return agent.invoke(state);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
export const graph = createEntrypointGraph({
|
|
157
|
+
stateSchema: State,
|
|
158
|
+
graph: workflow,
|
|
159
|
+
});
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
// app.ts
|
|
164
|
+
import { registerGraph } from '@langgraph-js/pure-graph';
|
|
165
|
+
import { graph as entrypointGraph } from './agent/entrypoint-graph';
|
|
166
|
+
import { Hono } from 'hono';
|
|
167
|
+
import LangGraphApp, { type LangGraphServerContext } from '@langgraph-js/pure-graph/dist/adapter/hono/index';
|
|
168
|
+
|
|
169
|
+
// Register your entrypoint graph
|
|
170
|
+
registerGraph('my-entrypoint', entrypointGraph);
|
|
171
|
+
|
|
172
|
+
const app = new Hono<{ Variables: LangGraphServerContext }>();
|
|
173
|
+
|
|
174
|
+
app.route('/', LangGraphApp);
|
|
175
|
+
|
|
176
|
+
export default app;
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
3. **Configure Environment Variables**
|
|
100
180
|
|
|
101
181
|
Add the necessary environment variables to your `.env` file.
|
|
102
182
|
|
|
@@ -106,6 +186,151 @@ To integrate Pure Graph into a Hono.js project, follow these steps:
|
|
|
106
186
|
REDIS_URL="" # Required if using Redis
|
|
107
187
|
```
|
|
108
188
|
|
|
189
|
+
## Context Passing
|
|
190
|
+
|
|
191
|
+
Pure Graph supports passing custom context data to your graphs, which can be accessed via `getConfig().configurable` in your graph logic. This allows you to inject user-specific data, session information, or any other custom data into your LangGraph workflows.
|
|
192
|
+
|
|
193
|
+
### Graph Code Example
|
|
194
|
+
|
|
195
|
+
Here's how to access context in your graph logic:
|
|
196
|
+
|
|
197
|
+
```ts
|
|
198
|
+
// agent/context-aware-graph.ts
|
|
199
|
+
import { Annotation, entrypoint, getConfig } from '@langchain/langgraph';
|
|
200
|
+
import { createReactAgent, createReactAgentAnnotation } from '@langchain/langgraph/prebuilt';
|
|
201
|
+
import { createState } from '@langgraph-js/pro';
|
|
202
|
+
import { createEntrypointGraph } from '@langgraph-js/pure-graph';
|
|
203
|
+
import { ChatOpenAI } from '@langchain/openai';
|
|
204
|
+
|
|
205
|
+
const State = createState(createReactAgentAnnotation()).build({});
|
|
206
|
+
|
|
207
|
+
const workflow = entrypoint('context-aware-graph', async (state: typeof State.State) => {
|
|
208
|
+
// Access context data passed from middleware
|
|
209
|
+
const config = getConfig();
|
|
210
|
+
|
|
211
|
+
// Context is available in config.configurable
|
|
212
|
+
const userId = config.configurable?.userId;
|
|
213
|
+
const sessionId = config.configurable?.sessionId;
|
|
214
|
+
const preferences = config.configurable?.preferences;
|
|
215
|
+
|
|
216
|
+
console.log('Context received:', {
|
|
217
|
+
userId,
|
|
218
|
+
sessionId,
|
|
219
|
+
preferences,
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
// Use context data in your graph logic
|
|
223
|
+
const systemMessage = `You are a helpful assistant for user ${userId || 'anonymous'}.
|
|
224
|
+
User preferences: ${JSON.stringify(preferences || {})}`;
|
|
225
|
+
|
|
226
|
+
const agent = createReactAgent({
|
|
227
|
+
llm: new ChatOpenAI({
|
|
228
|
+
model: 'your-model',
|
|
229
|
+
}),
|
|
230
|
+
prompt: systemMessage,
|
|
231
|
+
tools: [], // Add your tools here
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
return agent.invoke(state);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
export const graph = createEntrypointGraph({
|
|
238
|
+
stateSchema: State,
|
|
239
|
+
graph: workflow,
|
|
240
|
+
});
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Hono.js Implementation
|
|
244
|
+
|
|
245
|
+
In Hono.js, you can inject context using middleware:
|
|
246
|
+
|
|
247
|
+
```ts
|
|
248
|
+
// app.ts
|
|
249
|
+
import { registerGraph } from '@langgraph-js/pure-graph';
|
|
250
|
+
import { graph as contextAwareGraph } from './agent/context-aware-graph';
|
|
251
|
+
import { Hono } from 'hono';
|
|
252
|
+
import LangGraphApp, { type LangGraphServerContext } from '@langgraph-js/pure-graph/dist/adapter/hono/index';
|
|
253
|
+
|
|
254
|
+
// Register your context-aware graph
|
|
255
|
+
registerGraph('context-aware', contextAwareGraph);
|
|
256
|
+
|
|
257
|
+
const app = new Hono<{ Variables: LangGraphServerContext }>();
|
|
258
|
+
|
|
259
|
+
// Middleware to inject custom context
|
|
260
|
+
app.use('/api/langgraph/*', async (c, next) => {
|
|
261
|
+
// You can get context from authentication, request data, etc.
|
|
262
|
+
const userId = c.req.header('x-user-id') || 'anonymous';
|
|
263
|
+
const sessionId = c.req.header('x-session-id') || 'session-123';
|
|
264
|
+
|
|
265
|
+
c.set('langgraph_context', {
|
|
266
|
+
userId,
|
|
267
|
+
sessionId,
|
|
268
|
+
preferences: { theme: 'dark', language: 'zh' },
|
|
269
|
+
metadata: { source: 'hono-app', timestamp: new Date().toISOString() },
|
|
270
|
+
// Add any custom fields your graph needs
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
await next();
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
app.route('/api', LangGraphApp);
|
|
277
|
+
|
|
278
|
+
export default app;
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Next.js Implementation
|
|
282
|
+
|
|
283
|
+
In Next.js, you can inject context using middleware:
|
|
284
|
+
|
|
285
|
+
```ts
|
|
286
|
+
// middleware.ts
|
|
287
|
+
import type { NextRequest } from 'next/server';
|
|
288
|
+
import { NextResponse } from 'next/server';
|
|
289
|
+
|
|
290
|
+
export function middleware(request: NextRequest) {
|
|
291
|
+
const requestHeaders = new Headers(request.headers);
|
|
292
|
+
|
|
293
|
+
// Add custom context to x-langgraph-context header
|
|
294
|
+
if (request.nextUrl.pathname.startsWith('/api/langgraph/')) {
|
|
295
|
+
// You can get context from cookies, headers, or other sources
|
|
296
|
+
const userId = request.cookies.get('user-id')?.value || 'anonymous';
|
|
297
|
+
const sessionId = request.cookies.get('session-id')?.value || 'session-123';
|
|
298
|
+
|
|
299
|
+
const langgraphContext = {
|
|
300
|
+
userId,
|
|
301
|
+
sessionId,
|
|
302
|
+
preferences: { theme: 'dark', language: 'zh' },
|
|
303
|
+
metadata: { source: 'nextjs-app', timestamp: new Date().toISOString() },
|
|
304
|
+
// Add any custom fields your graph needs
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
requestHeaders.set('x-langgraph-context', JSON.stringify(langgraphContext));
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const response = NextResponse.next({
|
|
311
|
+
request: { headers: requestHeaders },
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
return response;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
export const config = {
|
|
318
|
+
matcher: '/api/langgraph/:path*',
|
|
319
|
+
};
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
```ts
|
|
323
|
+
// app/api/langgraph/[...path]/route.ts
|
|
324
|
+
import { GET, POST, DELETE } from '@langgraph-js/pure-graph/dist/adapter/nextjs/router';
|
|
325
|
+
import { registerGraph } from '@langgraph-js/pure-graph';
|
|
326
|
+
import { graph as contextAwareGraph } from '@/agent/context-aware-graph';
|
|
327
|
+
|
|
328
|
+
// Register your context-aware graph
|
|
329
|
+
registerGraph('context-aware', contextAwareGraph);
|
|
330
|
+
|
|
331
|
+
export { GET, POST, DELETE };
|
|
332
|
+
```
|
|
333
|
+
|
|
109
334
|
## Environment Configuration
|
|
110
335
|
|
|
111
336
|
Here are the environment variables you need to configure:
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
|
-
|
|
2
|
+
export interface LangGraphServerContext {
|
|
3
|
+
langgraph_context: any;
|
|
4
|
+
}
|
|
5
|
+
declare const app: Hono<{
|
|
6
|
+
Variables: LangGraphServerContext;
|
|
7
|
+
}, import("hono/types").BlankSchema, "/">;
|
|
3
8
|
export default app;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
2
|
import { zValidator } from '@hono/zod-validator';
|
|
3
|
-
import { c as createEndpoint, s as serialiseAsDict } from '../../createEndpoint-
|
|
3
|
+
import { c as createEndpoint, s as serialiseAsDict } from '../../createEndpoint-D56l-tDn.js';
|
|
4
4
|
import { A as AssistantsSearchSchema, a as AssistantGraphQuerySchema, T as ThreadIdParamSchema, R as RunStreamPayloadSchema, b as RunListQuerySchema, c as RunIdParamSchema, d as RunCancelQuerySchema, e as ThreadStateUpdate, f as ThreadCreatePayloadSchema, g as ThreadSearchPayloadSchema } from '../../zod-BaCzVUl8.js';
|
|
5
5
|
import { streamSSE } from 'hono/streaming';
|
|
6
6
|
import z from 'zod';
|
|
@@ -33,6 +33,12 @@ api$1.post(
|
|
|
33
33
|
const { thread_id } = c.req.valid("param");
|
|
34
34
|
const payload = c.req.valid("json");
|
|
35
35
|
return streamSSE(c, async (stream) => {
|
|
36
|
+
payload.config = payload.config || {};
|
|
37
|
+
payload.config.configurable = payload.config.configurable || {};
|
|
38
|
+
const langgraphContext = c.get("langgraph_context");
|
|
39
|
+
if (langgraphContext) {
|
|
40
|
+
Object.assign(payload.config.configurable, langgraphContext);
|
|
41
|
+
}
|
|
36
42
|
for await (const { event, data } of client.runs.stream(thread_id, payload.assistant_id, payload)) {
|
|
37
43
|
await stream.writeSSE({ data: serialiseAsDict(data) ?? "", event });
|
|
38
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/adapter/hono/endpoint.ts","../../../src/adapter/hono/assistants.ts","../../../src/adapter/hono/runs.ts","../../../src/adapter/hono/threads.ts","../../../src/adapter/hono/index.ts"],"sourcesContent":["import { createEndpoint } from '../../createEndpoint.js';\n\nexport const client = createEndpoint();\n","import { zValidator } from '@hono/zod-validator';\nimport { Hono } from 'hono';\nimport { client } from './endpoint';\nimport { AssistantsSearchSchema, AssistantGraphQuerySchema } from '../zod';\nconst api = new Hono();\n\napi.post('/assistants/search', zValidator('json', AssistantsSearchSchema), async (c) => {\n // Search Assistants\n const payload = c.req.valid('json');\n let total = 0;\n const data = await client.assistants.search(payload);\n c.res.headers.set('X-Pagination-Total', total.toString());\n return c.json(data);\n});\n\napi.get('/assistants/:assistant_id/graph', zValidator('query', AssistantGraphQuerySchema), async (c) => {\n const xray = c.req.valid('query').xray;\n const data = await client.assistants.getGraph(c.req.param('assistant_id'), {\n xray: xray !== undefined ? xray === 'true' : undefined,\n });\n return c.json(data);\n});\n\nexport default api;\n","import { zValidator } from '@hono/zod-validator';\nimport { Hono } from 'hono';\n\nimport { streamSSE } from 'hono/streaming';\nimport { client } from './endpoint';\nimport {\n ThreadIdParamSchema,\n RunIdParamSchema,\n RunStreamPayloadSchema,\n RunListQuerySchema,\n RunCancelQuerySchema,\n ThreadStateUpdate,\n} from '../zod';\nimport { serialiseAsDict } from '../../graph/stream';\nimport { RunnableConfig } from '@langchain/core/runnables';\nimport z from 'zod';\n\nconst api = new Hono();\n\n// 最常用的对话接口\napi.post(\n '/threads/:thread_id/runs/stream',\n zValidator('param', ThreadIdParamSchema),\n zValidator('json', RunStreamPayloadSchema),\n async (c) => {\n // Stream Run\n const { thread_id } = c.req.valid('param');\n const payload = c.req.valid('json');\n\n // c.header('Content-Location', `/threads/${thread_id}/runs/${run.run_id}`);\n return streamSSE(c, async (stream) => {\n /** @ts-ignore zod v3 的问题,与 ts 类型不一致 */\n for await (const { event, data } of client.runs.stream(thread_id, payload.assistant_id, payload)) {\n await stream.writeSSE({ data: serialiseAsDict(data) ?? '', event });\n }\n });\n },\n);\n\napi.get(\n '/threads/:thread_id/runs',\n zValidator('param', ThreadIdParamSchema),\n zValidator('query', RunListQuerySchema),\n async (c) => {\n const { thread_id } = c.req.valid('param');\n const { limit, offset, status } = c.req.valid('query');\n const runs = await client.runs.list(thread_id, { limit, offset, status });\n return c.json(runs);\n },\n);\n\napi.post(\n '/threads/:thread_id/runs/:run_id/cancel',\n zValidator('param', RunIdParamSchema),\n zValidator('query', RunCancelQuerySchema),\n async (c) => {\n // Cancel Run Http\n const { thread_id, run_id } = c.req.valid('param');\n const { wait, action } = c.req.valid('query');\n const cancel = client.runs.cancel(thread_id, run_id, wait, action);\n if (wait) {\n await cancel;\n }\n return c.body(null, wait ? 204 : 202);\n },\n);\n\napi.post(\n '/threads/:thread_id/state',\n zValidator('param', z.object({ thread_id: z.string().uuid() })),\n zValidator('json', ThreadStateUpdate),\n async (c) => {\n // Update Thread State\n const { thread_id } = c.req.valid('param');\n const payload = c.req.valid('json');\n // const config: RunnableConfig = { configurable: { thread_id } };\n\n // if (payload.checkpoint_id) {\n // config.configurable ??= {};\n // config.configurable.checkpoint_id = payload.checkpoint_id;\n // }\n // if (payload.checkpoint) {\n // config.configurable ??= {};\n // Object.assign(config.configurable, payload.checkpoint);\n // }\n\n const inserted = await client.threads.updateState(thread_id, payload);\n\n return c.json(inserted);\n },\n);\nexport default api;\n","import { zValidator } from '@hono/zod-validator';\nimport { Hono } from 'hono';\nimport { client } from './endpoint';\nimport { ThreadIdParamSchema, ThreadCreatePayloadSchema, ThreadSearchPayloadSchema } from '../zod';\n\nconst api = new Hono();\n\n// Threads Routes\napi.post('/threads', zValidator('json', ThreadCreatePayloadSchema), async (c) => {\n const payload = c.req.valid('json');\n const thread = await client.threads.create(payload);\n\n return c.json(thread);\n});\n\napi.post('/threads/search', zValidator('json', ThreadSearchPayloadSchema), async (c) => {\n // Search Threads\n const payload = c.req.valid('json');\n const result = await client.threads.search(payload as any);\n c.res.headers.set('X-Pagination-Total', result.length.toString());\n return c.json(result);\n});\n\napi.get('/threads/:thread_id', zValidator('param', ThreadIdParamSchema), async (c) => {\n // Get Thread\n const { thread_id } = c.req.valid('param');\n return c.json(await client.threads.get(thread_id));\n});\n\napi.delete('/threads/:thread_id', zValidator('param', ThreadIdParamSchema), async (c) => {\n // Delete Thread\n const { thread_id } = c.req.valid('param');\n await client.threads.delete(thread_id);\n return new Response(null, { status: 204 });\n});\n\nexport default api;\n","import { Hono } from 'hono';\nimport Assistants from './assistants';\nimport Runs from './runs';\nimport Threads from './threads';\nimport { cors } from 'hono/cors';\nconst app = new Hono();\n\napp.use(cors());\n\napp.route('/', Assistants);\napp.route('/', Runs);\napp.route('/', Threads);\n\nexport default app;\n"],"names":["api","Assistants","Runs","Threads"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/adapter/hono/endpoint.ts","../../../src/adapter/hono/assistants.ts","../../../src/adapter/hono/runs.ts","../../../src/adapter/hono/threads.ts","../../../src/adapter/hono/index.ts"],"sourcesContent":["import { createEndpoint } from '../../createEndpoint.js';\n\nexport const client = createEndpoint();\n","import { zValidator } from '@hono/zod-validator';\nimport { Hono } from 'hono';\nimport { client } from './endpoint';\nimport { AssistantsSearchSchema, AssistantGraphQuerySchema } from '../zod';\nconst api = new Hono();\n\napi.post('/assistants/search', zValidator('json', AssistantsSearchSchema), async (c) => {\n // Search Assistants\n const payload = c.req.valid('json');\n let total = 0;\n const data = await client.assistants.search(payload);\n c.res.headers.set('X-Pagination-Total', total.toString());\n return c.json(data);\n});\n\napi.get('/assistants/:assistant_id/graph', zValidator('query', AssistantGraphQuerySchema), async (c) => {\n const xray = c.req.valid('query').xray;\n const data = await client.assistants.getGraph(c.req.param('assistant_id'), {\n xray: xray !== undefined ? xray === 'true' : undefined,\n });\n return c.json(data);\n});\n\nexport default api;\n","import { zValidator } from '@hono/zod-validator';\nimport { Hono } from 'hono';\n\nimport { streamSSE } from 'hono/streaming';\nimport { client } from './endpoint';\nimport {\n ThreadIdParamSchema,\n RunIdParamSchema,\n RunStreamPayloadSchema,\n RunListQuerySchema,\n RunCancelQuerySchema,\n ThreadStateUpdate,\n} from '../zod';\nimport { serialiseAsDict } from '../../graph/stream';\nimport z from 'zod';\nimport type { LangGraphServerContext } from './index';\n\nconst api = new Hono<{ Variables: LangGraphServerContext }>();\n\n// 最常用的对话接口\napi.post(\n '/threads/:thread_id/runs/stream',\n zValidator('param', ThreadIdParamSchema),\n zValidator('json', RunStreamPayloadSchema),\n async (c) => {\n // Stream Run\n const { thread_id } = c.req.valid('param');\n const payload = c.req.valid('json');\n\n // c.header('Content-Location', `/threads/${thread_id}/runs/${run.run_id}`);\n return streamSSE(c, async (stream) => {\n payload.config = payload.config || {};\n payload.config.configurable = payload.config.configurable || {};\n const langgraphContext = c.get('langgraph_context');\n if (langgraphContext) {\n Object.assign(payload.config.configurable, langgraphContext);\n }\n /** @ts-ignore zod v3 的问题,与 ts 类型不一致 */\n for await (const { event, data } of client.runs.stream(thread_id, payload.assistant_id, payload)) {\n await stream.writeSSE({ data: serialiseAsDict(data) ?? '', event });\n }\n });\n },\n);\n\napi.get(\n '/threads/:thread_id/runs',\n zValidator('param', ThreadIdParamSchema),\n zValidator('query', RunListQuerySchema),\n async (c) => {\n const { thread_id } = c.req.valid('param');\n const { limit, offset, status } = c.req.valid('query');\n const runs = await client.runs.list(thread_id, { limit, offset, status });\n return c.json(runs);\n },\n);\n\napi.post(\n '/threads/:thread_id/runs/:run_id/cancel',\n zValidator('param', RunIdParamSchema),\n zValidator('query', RunCancelQuerySchema),\n async (c) => {\n // Cancel Run Http\n const { thread_id, run_id } = c.req.valid('param');\n const { wait, action } = c.req.valid('query');\n const cancel = client.runs.cancel(thread_id, run_id, wait, action);\n if (wait) {\n await cancel;\n }\n return c.body(null, wait ? 204 : 202);\n },\n);\n\napi.post(\n '/threads/:thread_id/state',\n zValidator('param', z.object({ thread_id: z.string().uuid() })),\n zValidator('json', ThreadStateUpdate),\n async (c) => {\n // Update Thread State\n const { thread_id } = c.req.valid('param');\n const payload = c.req.valid('json');\n // const config: RunnableConfig = { configurable: { thread_id } };\n\n // if (payload.checkpoint_id) {\n // config.configurable ??= {};\n // config.configurable.checkpoint_id = payload.checkpoint_id;\n // }\n // if (payload.checkpoint) {\n // config.configurable ??= {};\n // Object.assign(config.configurable, payload.checkpoint);\n // }\n\n const inserted = await client.threads.updateState(thread_id, payload);\n\n return c.json(inserted);\n },\n);\nexport default api;\n","import { zValidator } from '@hono/zod-validator';\nimport { Hono } from 'hono';\nimport { client } from './endpoint';\nimport { ThreadIdParamSchema, ThreadCreatePayloadSchema, ThreadSearchPayloadSchema } from '../zod';\n\nconst api = new Hono();\n\n// Threads Routes\napi.post('/threads', zValidator('json', ThreadCreatePayloadSchema), async (c) => {\n const payload = c.req.valid('json');\n const thread = await client.threads.create(payload);\n\n return c.json(thread);\n});\n\napi.post('/threads/search', zValidator('json', ThreadSearchPayloadSchema), async (c) => {\n // Search Threads\n const payload = c.req.valid('json');\n const result = await client.threads.search(payload as any);\n c.res.headers.set('X-Pagination-Total', result.length.toString());\n return c.json(result);\n});\n\napi.get('/threads/:thread_id', zValidator('param', ThreadIdParamSchema), async (c) => {\n // Get Thread\n const { thread_id } = c.req.valid('param');\n return c.json(await client.threads.get(thread_id));\n});\n\napi.delete('/threads/:thread_id', zValidator('param', ThreadIdParamSchema), async (c) => {\n // Delete Thread\n const { thread_id } = c.req.valid('param');\n await client.threads.delete(thread_id);\n return new Response(null, { status: 204 });\n});\n\nexport default api;\n","import { Hono } from 'hono';\nimport Assistants from './assistants';\nimport Runs from './runs';\nimport Threads from './threads';\nimport { cors } from 'hono/cors';\n\nexport interface LangGraphServerContext {\n langgraph_context: any;\n}\nconst app = new Hono<{ Variables: LangGraphServerContext }>();\n\napp.use(cors());\n\napp.route('/', Assistants);\napp.route('/', Runs);\napp.route('/', Threads);\n\nexport default app;\n"],"names":["api","Assistants","Runs","Threads"],"mappings":"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"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
|
-
|
|
2
|
+
import type { LangGraphServerContext } from './index';
|
|
3
|
+
declare const api: Hono<{
|
|
4
|
+
Variables: LangGraphServerContext;
|
|
5
|
+
}, import("hono/types").BlankSchema, "/">;
|
|
3
6
|
export default api;
|
|
@@ -1 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
/** @ts-ignore */
|
|
2
|
+
import type { NextRequest } from 'next/server';
|
|
3
|
+
declare global {
|
|
4
|
+
var LG_INIT_PROMISE: Promise<{
|
|
5
|
+
GET: (req: NextRequest) => Promise<any>;
|
|
6
|
+
POST: (req: NextRequest) => Promise<any>;
|
|
7
|
+
DELETE: (req: NextRequest) => Promise<any>;
|
|
8
|
+
}> | undefined;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Lazy initialization of LangGraph
|
|
12
|
+
*
|
|
13
|
+
* Background:
|
|
14
|
+
* In Next.js, if you use top-level await to initialize directly in a module,
|
|
15
|
+
* initialization will be performed once for each context.
|
|
16
|
+
* Even if you use globalThis for caching, it is ineffective because globalThis is isolated per context.
|
|
17
|
+
*
|
|
18
|
+
* Solution:
|
|
19
|
+
* 1. Remove top-level await and switch to lazy initialization during request handling.
|
|
20
|
+
* 2. Use a Promise cache to ensure initialization only happens once per context.
|
|
21
|
+
* 3. Concurrent requests will share the same initialization Promise, avoiding redundant initialization.
|
|
22
|
+
*/
|
|
23
|
+
export declare function ensureInitialized(attachGraphPromise: () => Promise<void>): Promise<{
|
|
24
|
+
GET: (req: NextRequest) => Promise<any>;
|
|
25
|
+
POST: (req: NextRequest) => Promise<any>;
|
|
26
|
+
DELETE: (req: NextRequest) => Promise<any>;
|
|
27
|
+
}>;
|
|
@@ -1,175 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
async start(controller) {
|
|
11
|
-
try {
|
|
12
|
-
for await (const { event, data } of generator) {
|
|
13
|
-
const line = `event: ${event}
|
|
14
|
-
data: ${serialiseAsDict(data, 0)}
|
|
15
|
-
|
|
16
|
-
`;
|
|
17
|
-
controller.enqueue(encoder.encode(line));
|
|
18
|
-
}
|
|
19
|
-
} catch (err) {
|
|
20
|
-
} finally {
|
|
21
|
-
controller.close();
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
return new Response(stream, {
|
|
26
|
-
headers: {
|
|
27
|
-
"Content-Type": "text/event-stream; charset=utf-8",
|
|
28
|
-
"Cache-Control": "no-cache, no-transform",
|
|
29
|
-
Connection: "keep-alive"
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
async function GET(req) {
|
|
34
|
-
const url = new URL(req.url);
|
|
35
|
-
const pathname = url.pathname;
|
|
36
|
-
if (pathname.match(/\/assistants\/[^/]+\/graph$/)) {
|
|
37
|
-
const match = pathname.match(/\/assistants\/([^/]+)\/graph$/);
|
|
38
|
-
if (match) {
|
|
39
|
-
const assistant_id = match[1];
|
|
40
|
-
const xrayParam = url.searchParams.get("xray") ?? void 0;
|
|
41
|
-
const queryParams = { xray: xrayParam };
|
|
42
|
-
const { xray } = AssistantGraphQuerySchema.parse(queryParams);
|
|
43
|
-
const data = await client.assistants.getGraph(assistant_id, {
|
|
44
|
-
xray: xray !== void 0 ? xray === "true" : void 0
|
|
45
|
-
});
|
|
46
|
-
return NextResponse.json(data);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
if (pathname.match(/\/threads\/[0-9a-fA-F-]{36}$/)) {
|
|
50
|
-
const match = pathname.match(/\/threads\/([0-9a-fA-F-]{36})$/);
|
|
51
|
-
if (match) {
|
|
52
|
-
const thread_id = match[1];
|
|
53
|
-
const data = await client.threads.get(thread_id);
|
|
54
|
-
return NextResponse.json(data);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
if (pathname.match(/\/threads\/[0-9a-fA-F-]{36}\/runs$/)) {
|
|
58
|
-
const match = pathname.match(/\/threads\/([0-9a-fA-F-]{36})\/runs$/);
|
|
59
|
-
if (match) {
|
|
60
|
-
const thread_id = match[1];
|
|
61
|
-
const limit = url.searchParams.get("limit") ?? void 0;
|
|
62
|
-
const offset = url.searchParams.get("offset") ?? void 0;
|
|
63
|
-
const status = url.searchParams.get("status") ?? void 0;
|
|
64
|
-
const queryParams = { limit, offset, status };
|
|
65
|
-
const {
|
|
66
|
-
limit: parsedLimit,
|
|
67
|
-
offset: parsedOffset,
|
|
68
|
-
status: parsedStatus
|
|
69
|
-
} = RunListQuerySchema.parse(queryParams);
|
|
70
|
-
const runs = await client.runs.list(thread_id, {
|
|
71
|
-
limit: parsedLimit,
|
|
72
|
-
offset: parsedOffset,
|
|
73
|
-
status: parsedStatus
|
|
74
|
-
});
|
|
75
|
-
return Response.json(runs);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return new NextResponse("Not Found", { status: 404 });
|
|
79
|
-
}
|
|
80
|
-
async function POST(req) {
|
|
81
|
-
const url = new URL(req.url);
|
|
82
|
-
const pathname = url.pathname;
|
|
83
|
-
if (pathname.endsWith("/assistants/search")) {
|
|
84
|
-
const body = await req.json();
|
|
85
|
-
const payload = AssistantsSearchSchema.parse(body);
|
|
86
|
-
const data = await client.assistants.search({
|
|
87
|
-
graphId: payload.graph_id,
|
|
88
|
-
metadata: payload.metadata,
|
|
89
|
-
limit: payload.limit,
|
|
90
|
-
offset: payload.offset
|
|
91
|
-
});
|
|
92
|
-
return NextResponse.json(data, {
|
|
93
|
-
headers: { "X-Pagination-Total": String(data.length) }
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
if (pathname.endsWith("/threads")) {
|
|
97
|
-
const body = await req.json();
|
|
98
|
-
const payload = ThreadCreatePayloadSchema.parse(body);
|
|
99
|
-
const thread = await client.threads.create({
|
|
100
|
-
thread_id: payload.thread_id,
|
|
101
|
-
metadata: payload.metadata,
|
|
102
|
-
if_exists: payload.if_exists ?? void 0
|
|
103
|
-
});
|
|
104
|
-
return NextResponse.json(thread);
|
|
105
|
-
}
|
|
106
|
-
if (pathname.endsWith("/threads/search")) {
|
|
107
|
-
const body = await req.json();
|
|
108
|
-
const payload = ThreadSearchPayloadSchema.parse(body);
|
|
109
|
-
const result = await client.threads.search({
|
|
110
|
-
metadata: payload.metadata,
|
|
111
|
-
status: payload.status,
|
|
112
|
-
limit: payload.limit,
|
|
113
|
-
offset: payload.offset,
|
|
114
|
-
sortBy: payload.sort_by ?? void 0,
|
|
115
|
-
sortOrder: payload.sort_order ?? void 0
|
|
116
|
-
});
|
|
117
|
-
return NextResponse.json(result, {
|
|
118
|
-
headers: { "X-Pagination-Total": String(result.length) }
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
if (pathname.match(/\/threads\/[0-9a-fA-F-]{36}\/state$/)) {
|
|
122
|
-
const match = pathname.match(/\/threads\/([0-9a-fA-F-]{36})\/state$/);
|
|
123
|
-
if (match) {
|
|
124
|
-
const thread_id = match[1];
|
|
125
|
-
const body = await req.json();
|
|
126
|
-
const payload = ThreadStateUpdate.parse(body);
|
|
127
|
-
const result = await client.threads.updateState(thread_id, payload);
|
|
128
|
-
return NextResponse.json(result);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
if (pathname.match(/\/threads\/[0-9a-fA-F-]{36}\/runs\/stream$/)) {
|
|
132
|
-
const match = pathname.match(/\/threads\/([0-9a-fA-F-]{36})\/runs\/stream$/);
|
|
133
|
-
if (match) {
|
|
134
|
-
const thread_id = match[1];
|
|
135
|
-
const body = await req.json();
|
|
136
|
-
const payload = RunStreamPayloadSchema.parse(body);
|
|
137
|
-
const generator = client.runs.stream(thread_id, payload.assistant_id, payload);
|
|
138
|
-
return sseResponse(generator);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
if (pathname.match(/\/threads\/[0-9a-fA-F-]{36}\/runs\/[0-9a-fA-F-]{36}\/cancel$/)) {
|
|
142
|
-
const match = pathname.match(/\/threads\/([0-9a-fA-F-]{36})\/runs\/([0-9a-fA-F-]{36})\/cancel$/);
|
|
143
|
-
if (match) {
|
|
144
|
-
const thread_id = match[1];
|
|
145
|
-
const run_id = match[2];
|
|
146
|
-
const waitParam = url.searchParams.get("wait") ?? void 0;
|
|
147
|
-
const actionParam = url.searchParams.get("action") ?? void 0;
|
|
148
|
-
const queryParams = {
|
|
149
|
-
wait: waitParam ? waitParam === "true" : false,
|
|
150
|
-
action: actionParam ?? "interrupt"
|
|
1
|
+
async function ensureInitialized(attachGraphPromise) {
|
|
2
|
+
if (globalThis.LG_INIT_PROMISE === void 0) {
|
|
3
|
+
globalThis.LG_INIT_PROMISE = (async () => {
|
|
4
|
+
await attachGraphPromise();
|
|
5
|
+
const { GET, POST, DELETE } = await import('../../router-BbUgLFyh.js');
|
|
6
|
+
return {
|
|
7
|
+
GET,
|
|
8
|
+
POST,
|
|
9
|
+
DELETE
|
|
151
10
|
};
|
|
152
|
-
|
|
153
|
-
const promise = client.runs.cancel(thread_id, run_id, wait, action);
|
|
154
|
-
if (wait) await promise;
|
|
155
|
-
return new Response(null, { status: wait ? 204 : 202 });
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return new NextResponse("Not Found", { status: 404 });
|
|
159
|
-
}
|
|
160
|
-
async function DELETE(req) {
|
|
161
|
-
const url = new URL(req.url);
|
|
162
|
-
const pathname = url.pathname;
|
|
163
|
-
if (pathname.match(/\/threads\/[0-9a-fA-F-]{36}$/)) {
|
|
164
|
-
const match = pathname.match(/\/threads\/([0-9a-fA-F-]{36})$/);
|
|
165
|
-
if (match) {
|
|
166
|
-
const thread_id = match[1];
|
|
167
|
-
await client.threads.delete(thread_id);
|
|
168
|
-
return new NextResponse(null, { status: 204 });
|
|
169
|
-
}
|
|
11
|
+
})();
|
|
170
12
|
}
|
|
171
|
-
return
|
|
13
|
+
return globalThis.LG_INIT_PROMISE;
|
|
172
14
|
}
|
|
173
15
|
|
|
174
|
-
export {
|
|
16
|
+
export { ensureInitialized };
|
|
175
17
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/adapter/nextjs/endpoint.ts","../../../src/adapter/nextjs/router.ts"],"sourcesContent":["import { createEndpoint } from '../../createEndpoint.js';\nexport const client = createEndpoint();\n","/** @ts-ignore */\nimport { NextRequest, NextResponse } from 'next/server';\nimport { client } from './endpoint';\nimport {\n AssistantsSearchSchema,\n AssistantGraphQuerySchema,\n RunStreamPayloadSchema,\n RunListQuerySchema,\n RunCancelQuerySchema,\n ThreadCreatePayloadSchema,\n ThreadSearchPayloadSchema,\n ThreadStateUpdate,\n} from '../zod';\nimport { serialiseAsDict } from '../../graph/stream';\n\n// Next.js App Router 的 SSE 响应实现\nasync function sseResponse(generator: AsyncGenerator<{ event: string; data: unknown }>): Promise<Response> {\n const encoder = new TextEncoder();\n const stream = new ReadableStream({\n async start(controller) {\n try {\n for await (const { event, data } of generator) {\n const line = `event: ${event}\\n` + `data: ${serialiseAsDict(data, 0)}\\n\\n`;\n controller.enqueue(encoder.encode(line));\n }\n } catch (err) {\n // ignore\n } finally {\n controller.close();\n }\n },\n });\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream; charset=utf-8',\n 'Cache-Control': 'no-cache, no-transform',\n Connection: 'keep-alive',\n },\n });\n}\n\n// 统一路由处理器\nexport async function GET(req: NextRequest) {\n const url = new URL(req.url);\n const pathname = url.pathname;\n\n // Assistants routes\n if (pathname.match(/\\/assistants\\/[^/]+\\/graph$/)) {\n const match = pathname.match(/\\/assistants\\/([^/]+)\\/graph$/);\n if (match) {\n const assistant_id = match[1];\n const xrayParam = url.searchParams.get('xray') ?? undefined;\n const queryParams = { xray: xrayParam };\n const { xray } = AssistantGraphQuerySchema.parse(queryParams);\n const data = await client.assistants.getGraph(assistant_id, {\n xray: xray !== undefined ? xray === 'true' : undefined,\n });\n return NextResponse.json(data);\n }\n }\n\n // Threads routes\n if (pathname.match(/\\/threads\\/[0-9a-fA-F-]{36}$/)) {\n const match = pathname.match(/\\/threads\\/([0-9a-fA-F-]{36})$/);\n if (match) {\n const thread_id = match[1];\n const data = await client.threads.get(thread_id);\n return NextResponse.json(data);\n }\n }\n\n // Runs routes\n if (pathname.match(/\\/threads\\/[0-9a-fA-F-]{36}\\/runs$/)) {\n const match = pathname.match(/\\/threads\\/([0-9a-fA-F-]{36})\\/runs$/);\n if (match) {\n const thread_id = match[1];\n const limit = url.searchParams.get('limit') ?? undefined;\n const offset = url.searchParams.get('offset') ?? undefined;\n const status = url.searchParams.get('status') ?? undefined;\n const queryParams = { limit, offset, status };\n const {\n limit: parsedLimit,\n offset: parsedOffset,\n status: parsedStatus,\n } = RunListQuerySchema.parse(queryParams);\n const runs = await client.runs.list(thread_id, {\n limit: parsedLimit,\n offset: parsedOffset,\n status: parsedStatus,\n });\n return Response.json(runs);\n }\n }\n\n return new NextResponse('Not Found', { status: 404 });\n}\n\nexport async function POST(req: NextRequest) {\n const url = new URL(req.url);\n const pathname = url.pathname;\n\n // Assistants routes\n if (pathname.endsWith('/assistants/search')) {\n const body = await req.json();\n const payload = AssistantsSearchSchema.parse(body);\n const data = await client.assistants.search({\n graphId: payload.graph_id,\n metadata: payload.metadata as any,\n limit: payload.limit,\n offset: payload.offset,\n } as any);\n return NextResponse.json(data, {\n headers: { 'X-Pagination-Total': String(data.length) },\n });\n }\n\n // Threads routes\n if (pathname.endsWith('/threads')) {\n const body = await req.json();\n const payload = ThreadCreatePayloadSchema.parse(body);\n const thread = await client.threads.create({\n thread_id: payload.thread_id,\n metadata: payload.metadata as any,\n if_exists: (payload.if_exists as any) ?? undefined,\n });\n return NextResponse.json(thread);\n }\n\n if (pathname.endsWith('/threads/search')) {\n const body = await req.json();\n const payload = ThreadSearchPayloadSchema.parse(body);\n const result = await client.threads.search({\n metadata: payload.metadata as any,\n status: payload.status as any,\n limit: payload.limit,\n offset: payload.offset,\n sortBy: (payload.sort_by as any) ?? undefined,\n sortOrder: (payload.sort_order as any) ?? undefined,\n });\n return NextResponse.json(result, {\n headers: { 'X-Pagination-Total': String(result.length) },\n });\n }\n\n // Threads state update\n if (pathname.match(/\\/threads\\/[0-9a-fA-F-]{36}\\/state$/)) {\n const match = pathname.match(/\\/threads\\/([0-9a-fA-F-]{36})\\/state$/);\n if (match) {\n const thread_id = match[1];\n const body = await req.json();\n const payload = ThreadStateUpdate.parse(body);\n const result = await client.threads.updateState(thread_id, payload);\n return NextResponse.json(result);\n }\n }\n\n // Runs routes - stream\n if (pathname.match(/\\/threads\\/[0-9a-fA-F-]{36}\\/runs\\/stream$/)) {\n const match = pathname.match(/\\/threads\\/([0-9a-fA-F-]{36})\\/runs\\/stream$/);\n if (match) {\n const thread_id = match[1];\n const body = await req.json();\n const payload = RunStreamPayloadSchema.parse(body);\n const generator = client.runs.stream(thread_id, payload.assistant_id as string, payload as any);\n return sseResponse(generator as any);\n }\n }\n\n // Runs routes - cancel\n if (pathname.match(/\\/threads\\/[0-9a-fA-F-]{36}\\/runs\\/[0-9a-fA-F-]{36}\\/cancel$/)) {\n const match = pathname.match(/\\/threads\\/([0-9a-fA-F-]{36})\\/runs\\/([0-9a-fA-F-]{36})\\/cancel$/);\n if (match) {\n const thread_id = match[1];\n const run_id = match[2];\n const waitParam = url.searchParams.get('wait') ?? undefined;\n const actionParam = url.searchParams.get('action') ?? undefined;\n const queryParams = {\n wait: waitParam ? waitParam === 'true' : false,\n action: actionParam ?? 'interrupt',\n };\n const { wait, action } = RunCancelQuerySchema.parse(queryParams);\n const promise = client.runs.cancel(thread_id, run_id, wait, action);\n if (wait) await promise;\n return new Response(null, { status: wait ? 204 : 202 });\n }\n }\n\n return new NextResponse('Not Found', { status: 404 });\n}\n\nexport async function DELETE(req: NextRequest) {\n const url = new URL(req.url);\n const pathname = url.pathname;\n\n // Threads routes\n if (pathname.match(/\\/threads\\/[0-9a-fA-F-]{36}$/)) {\n const match = pathname.match(/\\/threads\\/([0-9a-fA-F-]{36})$/);\n if (match) {\n const thread_id = match[1];\n await client.threads.delete(thread_id);\n return new NextResponse(null, { status: 204 });\n }\n }\n\n return new NextResponse('Not Found', { status: 404 });\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/adapter/nextjs/index.ts"],"sourcesContent":["/** @ts-ignore */\nimport type { NextRequest } from 'next/server';\ndeclare global {\n var LG_INIT_PROMISE:\n | Promise<{\n GET: (req: NextRequest) => Promise<any>;\n POST: (req: NextRequest) => Promise<any>;\n DELETE: (req: NextRequest) => Promise<any>;\n }>\n | undefined;\n}\n/**\n * Lazy initialization of LangGraph\n *\n * Background:\n * In Next.js, if you use top-level await to initialize directly in a module,\n * initialization will be performed once for each context.\n * Even if you use globalThis for caching, it is ineffective because globalThis is isolated per context.\n *\n * Solution:\n * 1. Remove top-level await and switch to lazy initialization during request handling.\n * 2. Use a Promise cache to ensure initialization only happens once per context.\n * 3. Concurrent requests will share the same initialization Promise, avoiding redundant initialization.\n */\nexport async function ensureInitialized(attachGraphPromise: () => Promise<void>) {\n if (globalThis.LG_INIT_PROMISE === undefined) {\n globalThis.LG_INIT_PROMISE = (async () => {\n await attachGraphPromise();\n const { GET, POST, DELETE } = await import('./router');\n return {\n GET,\n POST,\n DELETE,\n };\n })();\n }\n return globalThis.LG_INIT_PROMISE;\n}\n"],"names":[],"mappings":"AAwBA,eAAsB,kBAAkB,kBAAA,EAAyC;AAC7E,EAAA,IAAI,UAAA,CAAW,oBAAoB,MAAA,EAAW;AAC1C,IAAA,UAAA,CAAW,mBAAmB,YAAY;AACtC,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,QAAO,GAAI,MAAM,OAAO,0BAAU,CAAA;AACrD,MAAA,OAAO;AAAA,QACH,GAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ,CAAA,GAAG;AAAA,EACP;AACA,EAAA,OAAO,UAAA,CAAW,eAAA;AACtB;;;;"}
|