给 AI 删文件的权限太危险
直接给 AI 赋予删除文件的 Tool 权限简直是噩梦,我之前试过一次,结果模型直接把文件给删了,完全没经过我同意。在公司里推行这种自动化工作流,如果不对关键操作做拦截,迟早得被运维骂死。后来研究发现 AI SDK 7 在模型调用层级就支持 Tool Approval,也就是说在执行具体的函数之前,可以先暂停下来弹个窗让用户点确认。
下一篇
那个所谓的“引用校验器”居然在骗我 →
这次我用 Nuxt 4 配合 Amazon Bedrock 跑通了这套流程,核心逻辑就是把权限交给用户,而不是完全信任模型。
实操部署步骤
首先得把环境搭起来,注意 Node.js 必须 22+,因为 AI SDK 7 强制要求 ESM。
一、初始化项目并安装依赖
npx nuxi@latest init nuxt-agent-approval
cd nuxt-agent-approval
npm install \
[email protected] \
[email protected] \
[email protected] \
@ai-sdk/[email protected] \
@ai-sdk/[email protected] \
@aws-sdk/[email protected] \
@nuxt/[email protected] \
[email protected]
npm install -D @iconify-json/[email protected]二、配置 Nuxt 运行时环境
在 nuxt.config.ts 里把 AWS 的区域和模型 ID 暴露出来,避免把密钥写死在代码里。
export default defineNuxtConfig({
modules: ['@nuxt/ui'],
css: ['~/assets/css/main.css'],
runtimeConfig: {
awsRegion: process.env.AWS_REGION ?? 'us-west-2',
bedrockModelId: process.env.NUXT_BEDROCK_MODEL_ID
}
})三、构建带路径校验的删除工具
为了防止 AI 搞破坏(比如通过 ../../ 删掉根目录文件),必须写一个路径拦截函数。
import { lstat, readdir, realpath, rm } from 'node:fs/promises'
import { resolve, relative, isAbsolute } from 'node:path'
import { tool } from 'ai'
import * as z from 'zod'
function resolveInsideFixtures(inputPath: string): string {
const root = resolve(process.cwd(), 'fixtures')
const target = resolve(root, inputPath)
const rel = relative(root, target)
if (rel === '' || rel.startsWith('..') || isAbsolute(rel)) {
throw createError({
statusCode: 400,
statusMessage: `Path escapes the fixtures directory: ${inputPath}`
})
}
return target
}
export const deleteFile = tool({
description: 'Delete a file in the fixtures directory',
inputSchema: z.object({ path: z.string() }),
execute: async ({ path }) => {
const fullPath = resolveInsideFixtures(path)
await rm(fullPath)
return { success: true, deleted: path }
}
})几点避坑心得
- 权限隔离: Approval 机制只能决定“要不要执行”,不能决定“执行了之后能干什么”。所以
resolveInsideFixtures这种物理路径隔离是必须的,否则模型只要骗过你的确认,依然能删掉package.json。 - 版本依赖: Nuxt 4 和 AI SDK 7 的配合比较微妙,一定要检查
package.json里的版本号,尤其是 Node 版本不对会导致模块加载直接报错。 - 交互体验: 在实际业务场景中,建议把 Approval 窗体设计得足够醒目,明确告知用户 AI 准备执行的具体命令,而不是简单地写个“确认执行”。
免费 AI 工具箱 · 全部完全免费
