以下页面介绍了一个示例应用:在 Deno Deploy 上部署 LangChain 深度代理,提供流式聊天 UI、子代理和线程历史记录。所有功能都由 Agent Streaming Protocol 支持,该协议通过 Hono 服务器上的 HTTP + SSE 路由处理器实现。React 前端是一个 Vite SPA(从 Next.js 示例移植而来);Deno 从单个 main.ts 入口同时提供构建后的静态资源和 API。 这是将 Next.js 示例移植到 Deno + Hono 的版本,展示了如何在 Deno Deploy 而不是 Vercel 上运行相同的代理技术栈。 源代码位于部署示例仓库中的 js-deno。

部署到 Deno Deploy

1

创建 Deno Deploy 项目

Fork 或克隆 langchain-ai/deployment-cookbook。在 Deno Deploy 控制台中,创建一个与此仓库关联的新项目。
2

配置构建设置

  • 将 Root Directory 设置为 js-deno。
  • 将构建命令设置为 deno task build:client(将 Vite SPA 构建到 dist/)。
  • 将入口点设置为 main.ts。
  • 在项目环境变量中添加 OPENAI_API_KEY。
3

部署

从控制台进行部署。Deno 的构建环境会运行构建命令,因此 dist/ 会在云端生成,无需提交到仓库。
或者,也可以使用内置的 deno deploy CLI(Deno 2.x)。deno.json 中的 deploy 配置块设置了 org/app。请将它们改为你自己的值(或者传入 --org/--app 标志,这些标志会覆盖配置中的值)。
deno task deploy 会运行 deno task build:client && deno deploy --prod,然后执行 rm -rf dist。由于 deno deploy --source local 会上传你的工作区(不包括 .gitignore 中指定的内容),且不会运行构建命令,因此必须在本地完成构建。只有与 GitHub 连接的应用才会运行这些构建命令。
CLI 的 --source local 流程有两个需要特别注意的问题:
  • dist/ 不能被 gitignore。 上传器会遵循 .gitignore,因此刚构建的 dist/ 必须在上传期间可见,否则所有非 /api 路由都会返回 404。仓库根目录的 .gitignore 会忽略所有 dist,因此 js-deno/.gitignore 使用 !dist/ 和 !dist/** 将其重新纳入。deno task deploy 流程会在上传后删除 dist/,所以即使它未被忽略,也不会因为残留而出现在 git status 中。
  • 不要使用 deploy.include 列表。 Deno Deploy 存在一个 bug:添加 include 后,构建会将入口点解析为 src/main.ts,从而失败。请依赖基于默认 .gitignore 的上传方式。
你也可以选择通过添加 .env.example 中的变量来启用 LangSmith 追踪。

必需的 API 端点

应用在 /api/threads/... 下提供 Agent Streaming Protocol。路由处理器位于 server/routes.ts,与 js-next/app/api/threads/ 中的 Next.js 处理器相对应。

最低要求(流式聊天)

可选功能(侧边栏)

请求流程

Deno 后端的工作原理

此示例作为一个单独的 Deno 进程运行:
  • main.ts:Deno.serve + Hono 应用。挂载 /api 路由,并从 dist/ 提供 Vite 构建的 SPA。
  • server/routes.ts:Agent Streaming Protocol 的 Hono 路由定义。
  • server/session.ts:LocalThreadSession:在 LangGraph StreamChannel 中缓冲协议事件,使用 matchesSubscription 进行筛选,并通过 SSE ReadableStream 将匹配的帧分发出去。
  • server/threads.ts:以检查点保存器为基础的 getState / updateState / getHistory 辅助函数,使用 LangGraph SDK 的线路格式。
  • server/registry.ts:进程本地的单例,负责管理代理,并为每个线程 ID 管理一个会话。
  • server/agent/:与 Next.js 示例相同的 createDeepAgent 编排器(研究员和数学专家子代理,以及模拟工具)。
Deno Deploy 会让每个隔离实例使用各自的内存内 MemorySaver 检查点保存器。若要在生产环境中跨隔离实例持久化数据,请换用持久化检查点保存器(Postgres、Redis、…)。路由处理器和 server/threads.ts 辅助函数无需更改。

生产环境持久化

开箱即用时,代理使用内存中的 MemorySaver 检查点保存器(server/agent/index.ts)和进程本地的会话映射(server/registry.ts)。这适用于本地开发和单隔离实例部署,但在 Deno Deploy 上(存在多个隔离实例和冷启动),对话状态无法跨实例持久保存。 请将 server/agent/index.ts 中的 MemorySaver 替换为持久化检查点保存器,例如 @langchain/langgraph-checkpoint-postgres 或 @langchain/langgraph-checkpoint-redis。此外,还需要一个共享的会话/重放存储,以确保 SSE 重连能够跨隔离实例正常工作。

本地开发

客户端需要 Deno 2.x 和 pnpm。
打开 http://localhost:5173,即可在启用热重载的情况下进行开发。Vite 开发服务器会将 /api 代理到 8000 端口上的 Deno 服务器。 若要以接近生产环境的方式在本地运行(单服务器、无 HMR):
打开 http://localhost:8000。

项目结构

  • main.ts:Deno Deploy 入口点(Deno.serve + Hono)。
  • server/agent/:包含子代理和模拟工具的深度代理(createDeepAgent)。
  • server/:协议服务器逻辑:session.ts、threads.ts、serialize.ts、registry.ts、routes.ts。
  • client/:Vite + React SPA(与 Next.js 示例使用相同的 UI)。
  • dist/:由 Deno 提供服务的 Vite 构建输出(由 deno task build:client 生成)。

另请参阅