A36第 1 / 1 课时未开始内容版本 1.0.0 · 核验于 2026-10-26

AI 功能上线检查

AI 功能上线检查 · 阅读后完成下方实验与检查题,再用「标记完成」记录进度。

学习目标

读完本课你能:把「AI 功能能不能上线」从感觉变成清单——秘密、配置、权限、失败、日志、评估六组检查,每一项都有明确的验证动作;执行一遍本站的真实检查清单并留档。

问题场景

周五晚上你把 AI 助手改完,本地一切正常,合上电脑。周一换到另一台机器启动,聊天框全是「AI 服务未配置」。排查半小时,发现新机器没有 .env.local。问题不在环境,在于「能不能跑」只存在你的脑子里,没有变成可执行、可重复的检查。

核心解释

上线检查清单的关键不是「全」,而是每一项都能执行出结果。「检查秘密管理是否良好」这种项没法打勾;「确认 .env.local 不在版本库里、启动后 /api/ai/status 返回 configured: true」才能打勾。本站对应的六组检查:

组 检查项 验证动作
秘密 密钥不进版本库、不出浏览器 git status 无 .env.local;Network 面板无密钥字段
配置 三个变量齐且值有效 启动后请求 /api/ai/status 看 configured 与 model
权限 工具只在白名单内执行 模型伪造的工具名返回「不在白名单」
失败 每类错误有 UI 表现 拔网线、改错 key,逐类触发
日志 调用有账、错误有类别 查 ai_call 表有新记录,error 字段可枚举
评估 提示/模型改动已回归 跑 A31 固定样例,对比通过率

配置组的验证端点是 /api/ai/status,本站的真实实现(app/api/ai/status/route.ts):

// GET 只报布尔,POST 才做真实连接测试
export async function GET() {
  const status = getAiConfigStatus(); // { configured, provider, model, baseUrlSet, keySet }
  return NextResponse.json(status);
}
export async function POST() {
  const result = await testConnection(); // 真发一条「回复两个字:在线」
  return NextResponse.json(result, { status: result.ok ? 200 : 502 });
}

检查命令按序执行,每一层过了才进下一层,失败定位最快:

npm run typecheck && npm run lint && npm run test   # 检查链(E01)
curl -s localhost:3000/api/ai/status                # 配置状态(GET)
curl -s -X POST localhost:3000/api/ai/status        # 真实连接(POST)
node scripts/e2e-core.mjs                           # 核心路径回归(E03)

示例拆解

拿「失败」这组做一次完整演示。目标:AiErrorCategory 的七类错误,每一类都亲手触发过一次,且用户看到的提示与类别匹配:

类别 触发方法 应看到
not_configured 清空 AI_API_KEY 重启 「密钥无效或无权限」/「未配置」
unreachable 改错 AI_BASE_URL 端口 「无法连接模型服务」
rate_limit 连续快速发多条 「请求频率或额度受限」
quota (若有测试账户)余额打空 「账户余额或额度不足」
model_error 指定一个不存在的模型名 「模型服务返回 4xx」
cancelled 生成中点「停止」 保留半截回答,标记已取消
unknown —— 兜底提示 + 查日志

关键点:cancelled 是正常分支不是故障(A12 的结论,检查时别误报);触发不了的类别(比如 quota)标注「无法本地触发,依赖上游」也是合格的检查结论——诚实比凑满重要。

动手任务

  1. 把本节两张表抄进项目文档(如 docs/launch-checklist.md),逐项执行并打勾,留下日期与结果。
  2. 故意把 AI_API_KEY 改成错值重启,验证 /api/ai/status 的 POST 返回 not_configured 类别,恢复后再验证一遍。
  3. 给清单补一项本课没覆盖、但你认为该查的(比如「data/ 目录损坏后如何恢复」),写清验证动作。

常见错误

  • 清单项不可执行:写「确保安全」「注意性能」,没法打勾也没法复查,等于没写。
  • 只验证 happy path:只测「配置对了能用」,不测「配置错了表现是否体面」——后者才是上线后最先遇到的事。
  • 检查一次管终身:配置、依赖、上游都会漂移,清单要跟着每次大改动重跑,留日期。
  • 把 cancelled 计入故障:用户主动停止不是错误,混进错误统计会污染 E06 的排错数据。

检查与复盘

  • 六组检查各能说出至少一个「可执行的验证动作」
  • 亲手触发过至少四类错误并确认 UI 提示与类别匹配
  • 本站清单已执行留档,包含执行日期与结果

参考资料

检查题共 1 题,提交后立即显示解析
答案由服务端判定;答错的题会自动进入复习计划。
Q1读代码中等

阅读本站 AI 配置状态接口的代码(上线检查清单「配置」组的验证端点)。GET 与 POST 分成两个动作的设计意图是什么?

// app/api/ai/status/route.ts(节选)
export async function GET() {
  const status = getAiConfigStatus();
  // { configured, provider, model, baseUrlSet, keySet }
  return NextResponse.json(status);
}
export async function POST() {
  const result = await testConnection(); // 真发一条「回复两个字:在线」
  return NextResponse.json(result, { status: result.ok ? 200 : 502 });
}

读完这一课了?

标记完成后,工作台会安排接下来的学习。

Command Palette

Search for a command to run...