用 Node.js 为智能体建立权限与审批网关
文章拆解一个模块化 Node.js 智能体网关,涵盖 JWT 会话验证、角色权限、动态工具授权和网关层人工审批。还介绍限流、模型回退及语义缓存,但用户资料仍使用模拟数据库。
AI 深度解读
企业里的 AI Agent,难点不只在于模型能不能选对工具,还在于谁有权调用、越权时谁来批准,以及执行过程能否追查。作者用 Node.js 搭了一个网关,把这些控制放到模型调用之外。
它的思路值得借鉴,但标题里的「生产级」需要打个问号:作者声称核心流程已在终端跑通,持久化、后台队列和管理界面仍是下一步。把它当成一份网关设计草图,比当成现成的生产方案更合适。
工具权限为什么要在请求进入模型前确定
作者按单一职责原则拆分网关:agent.js 负责终端 CLI 循环、安全检查、模型回退、语义缓存和决策路由;tools/createTools.js 根据用户权限创建工具集合;authentication/ 验证身份;timestampsWindow/ 管理限流和全局请求窗口;services/ 生成嵌入并为缓存做语义检索排序。
其中最关键的是基于角色的访问控制(RBAC)。每个请求先验证 JWT,再根据用户 ID 查询本地模拟用户库,确定允许使用哪些工具。例如,user_123 可以调用 weather 和 geoLocation,但不能调用 currencyConverter。
未经授权的工具不会进入发给模型的载荷。模型只能从当前可见的工具中选择,权限规则由应用代码决定。
先确定用户能做什么,再让模型决定怎么做,是这套架构最值得保留的顺序。
不过,隐藏工具只能缩小模型的选择范围。原文没有交代工具实际执行时是否再次校验权限,不能据此认定它已经封住所有越权路径。
遇到越权请求,网关怎样让人接手
作者没有把受限请求全部拒绝,而是在网关路由层加入人工介入(HITL)。
当请求需要受限工具时,网关通过 node:readline/promises 暂停执行,在终端询问操作员是否临时解锁。操作员输入 y 后,工具会被动态追加到当前会话的工具集合,Agent 随后继续执行。
这里有价值的是批准动作的位置:它发生在网关,而不是由模型自行决定是否放行。权限变化可以成为程序里一个明确的步骤。
但「临时」究竟持续多久,原文没有说清。它描述的是给当前会话追加工具,并未说明权限是否只用于一次调用、任务结束后是否回收,也未说明操作员身份如何验证。
终端里的暂停和继续,也不等于多人 Web 系统中的审批流程。作者尚未展示审批记录、请求与批准结果的绑定,以及服务重启后的恢复机制。
工具和兜底机制已接上,效果还缺证据
工具层使用 Zod schema 和 LangChain 工具封装,接入了三类能力:
GeoLocation通过 OpenStreetMap Nominatim APIs,把城市名解析为经纬度。Weather通过 Open-Meteo forecasts 获取当前天气指标。Currency Converter使用实时公开汇率进行换算,但原文没有给出具体供应方。
网关还包含输入输出检查:由第二个 guardrail agent 检查用户提示和 Agent 回复,识别恶意内容或敏感数据泄漏。配额耗尽时,系统按照 fallback map 切换 OpenRouter 模型;重复问题则尝试通过语义缓存复用历史回答,缓存内容包括查询嵌入和响应。
这些是作者报告已经实现的能力,原文没有提供测试数据。安全检查能拦住多少问题、增加多少延迟,模型切换后工具调用是否稳定,缓存命中率和误匹配情况如何,都无法从文章判断。
尤其是天气和汇率会变化,语义相似不代表旧答案仍然有效。原文没有说明缓存有效期,也没交代缓存是否按用户权限隔离。
我的判断
我赞同把身份、权限和人工批准放进网关统一管理。相比仅靠提示词约束模型,应用代码更容易明确表达执行边界;动态工具集合也让模型少面对一些无权使用的选项。
但「生产级」目前更多是目标。作者明确把 MongoDB 持久化用户、聊天历史和审计日志,Redis 与 BullMQ 处理重任务,以及 Frontend Dashboard 管理查询和监控日志,列为后续工作。
因此,这篇文章更像实现经验分享。它没有对照数据,也没有展示并发、故障恢复或安全测试,不能替它背书为经过生产验证的方案。一般团队可以借鉴模块划分和控制顺序,落地时仍需补齐权限回收、执行校验和审计等细节。
能拿来做什么
- 给现有 Node.js Agent 增加一层工具工厂,先验证身份并读取权限,再生成当前请求可见的工具集合,同时检查工具执行入口是否也验证权限。
- 接入人工批准时,先定义批准范围:是一次调用、一个任务还是整个会话,并明确失效条件,再把终端交互迁移到管理界面。
- 为天气、汇率等工具增加语义缓存前,先确定有效期和权限隔离规则,避免把相似问题直接视为可复用答案。
- 开发前端管理台时,把查询状态、待批准动作和审计记录作为主要界面信息;后台队列则对应作者计划用 Redis 与 BullMQ 处理的重任务。