@langgraph-js/pure-graph 1.4.7 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +234 -20
- package/dist/adapter/hono/index.d.ts +6 -1
- package/dist/adapter/hono/index.js +12 -3
- package/dist/adapter/hono/index.js.map +1 -1
- package/dist/adapter/hono/runs.d.ts +4 -1
- package/dist/adapter/nextjs/index.js +1 -1
- package/dist/{createEndpoint-B0FQz0jr.js → createEndpoint-D56l-tDn.js} +10 -10
- package/dist/{createEndpoint-B0FQz0jr.js.map → createEndpoint-D56l-tDn.js.map} +1 -1
- 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-DqflDUWZ.js → router-DKRP5e01.js} +10 -3
- package/dist/router-DKRP5e01.js.map +1 -0
- package/dist/types.d.ts +2 -2
- package/package.json +3 -1
- package/dist/router-DqflDUWZ.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as AssistantEndpoint, L as LangGraphGlobal, c as createEndpoint, r as registerGraph } from './createEndpoint-
|
|
1
|
+
export { A as AssistantEndpoint, L as LangGraphGlobal, c as createEndpoint, r as registerGraph } from './createEndpoint-D56l-tDn.js';
|
|
2
2
|
import { StateGraph } from '@langchain/langgraph';
|
|
3
3
|
|
|
4
4
|
const createEntrypointGraph = ({
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { B as BaseStreamQueue, C as CancelEventMessage } from './createEndpoint-
|
|
1
|
+
import { B as BaseStreamQueue, C as CancelEventMessage } from './createEndpoint-D56l-tDn.js';
|
|
2
2
|
import { createClient } from 'redis';
|
|
3
3
|
|
|
4
4
|
class RedisStreamQueue extends BaseStreamQueue {
|
|
@@ -117,4 +117,4 @@ class RedisStreamQueue extends BaseStreamQueue {
|
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
export { RedisStreamQueue };
|
|
120
|
-
//# sourceMappingURL=queue-
|
|
120
|
+
//# sourceMappingURL=queue-BnmSDnCz.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-
|
|
1
|
+
{"version":3,"file":"queue-BnmSDnCz.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 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 = 'default') {\n super(id, true);\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 this.redis.connect();\n this.subscriberRedis.connect();\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.lPush(this.queueKey, serializedData);\n\n // 设置队列 TTL 为 300 秒\n await this.redis.expire(this.queueKey, 300);\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(async (item: string) => {\n const parsed = JSON.parse(item) as EventMessage;\n return (await this.decodeData(parsed as any)) as EventMessage;\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}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server';
|
|
2
|
-
import { c as createEndpoint, s as serialiseAsDict } from './createEndpoint-
|
|
2
|
+
import { c as createEndpoint, s as serialiseAsDict } from './createEndpoint-D56l-tDn.js';
|
|
3
3
|
import { a as AssistantGraphQuerySchema, b as RunListQuerySchema, A as AssistantsSearchSchema, f as ThreadCreatePayloadSchema, g as ThreadSearchPayloadSchema, e as ThreadStateUpdate, R as RunStreamPayloadSchema, d as RunCancelQuerySchema } from './zod-BaCzVUl8.js';
|
|
4
4
|
|
|
5
5
|
const client = createEndpoint();
|
|
@@ -97,7 +97,7 @@ async function POST(req) {
|
|
|
97
97
|
const body = await req.json();
|
|
98
98
|
const payload = ThreadCreatePayloadSchema.parse(body);
|
|
99
99
|
const thread = await client.threads.create({
|
|
100
|
-
|
|
100
|
+
threadId: payload.thread_id,
|
|
101
101
|
metadata: payload.metadata,
|
|
102
102
|
if_exists: payload.if_exists ?? void 0
|
|
103
103
|
});
|
|
@@ -134,6 +134,13 @@ async function POST(req) {
|
|
|
134
134
|
const thread_id = match[1];
|
|
135
135
|
const body = await req.json();
|
|
136
136
|
const payload = RunStreamPayloadSchema.parse(body);
|
|
137
|
+
const langgraphContextHeader = req.headers.get("x-langgraph-context");
|
|
138
|
+
if (langgraphContextHeader) {
|
|
139
|
+
const langgraphContext = JSON.parse(decodeURIComponent(langgraphContextHeader));
|
|
140
|
+
payload.config = payload.config || {};
|
|
141
|
+
payload.config.configurable = payload.config.configurable || {};
|
|
142
|
+
Object.assign(payload.config.configurable, langgraphContext);
|
|
143
|
+
}
|
|
137
144
|
const generator = client.runs.stream(thread_id, payload.assistant_id, payload);
|
|
138
145
|
return sseResponse(generator);
|
|
139
146
|
}
|
|
@@ -172,4 +179,4 @@ async function DELETE(req) {
|
|
|
172
179
|
}
|
|
173
180
|
|
|
174
181
|
export { DELETE, GET, POST };
|
|
175
|
-
//# sourceMappingURL=router-
|
|
182
|
+
//# sourceMappingURL=router-DKRP5e01.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router-DKRP5e01.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 threadId: 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\n // Extract custom context from request headers\n const langgraphContextHeader = req.headers.get('x-langgraph-context');\n if (langgraphContextHeader) {\n const langgraphContext = JSON.parse(decodeURIComponent(langgraphContextHeader));\n payload.config = payload.config || {};\n payload.config.configurable = payload.config.configurable || {};\n Object.assign(payload.config.configurable, langgraphContext);\n }\n\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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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -57,9 +57,9 @@ export interface ILangGraphClient<TStateType = unknown> {
|
|
|
57
57
|
threads: {
|
|
58
58
|
create(payload?: {
|
|
59
59
|
metadata?: Metadata;
|
|
60
|
-
|
|
60
|
+
threadId?: string;
|
|
61
61
|
if_exists?: OnConflictBehavior;
|
|
62
|
-
|
|
62
|
+
graphId?: string;
|
|
63
63
|
}): Promise<Thread<TStateType>>;
|
|
64
64
|
search(query?: {
|
|
65
65
|
metadata?: Metadata;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@langgraph-js/pure-graph",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"description": "A library that provides a standard LangGraph endpoint for integrating into various frameworks like Next.js and Hono.js, with support for multiple storage backends (SQLite, PostgreSQL, Redis) and message queues.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -67,7 +67,9 @@
|
|
|
67
67
|
},
|
|
68
68
|
"scripts": {
|
|
69
69
|
"dev": "bun run test/hono.ts",
|
|
70
|
+
"dev:docs": "npx xyd-js",
|
|
70
71
|
"build": " vite build && tsc",
|
|
72
|
+
"build:docs": "npx xyd-js build",
|
|
71
73
|
"prepublish": "pnpm build"
|
|
72
74
|
}
|
|
73
75
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router-DqflDUWZ.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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"}
|