在本地运行 Vercel AI SDK 课程
使用本页在你的电脑上运行提取的客服代理。你需要将其 Express 服务器连接到 OpenAI 和课程中创建的 Supabase 数据,然后修改一个启动脚本,使 Node 从 .env 加载这些值。嵌入和向量数据库指南在相同类型的 Supabase 向量设置上运行一个相关项目。
准备工作
安装受支持的 Node.js LTS 版本。推荐使用 Node 24。你还需要:
- 一个具有账单和模型访问权限的 OpenAI API 密钥;
- 课程中创建的 Supabase 项目和数据;
- 一个 Supabase 密钥,或旧版的
service_role密钥。
密钥和 service_role 密钥绕过行级安全性。它们只能放在这个服务器端的 .env 中,永远不要放在浏览器代码里。参见 Supabase API 密钥。
打开和安装项目
在包含 package.json 的提取文件夹中打开终端,然后安装锁定的包:
$ cd path-to-your-downloaded-project
$ npm cipackage.json 的提取文件夹中运行 npm ci。它安装课程构建时使用的确切包版本,所以这里没有任何需要配置或猜测的。 使 Node 加载 .env
打开 package.json 并将启动脚本从:
"start": "node server.js"改为:
"start": "node --env-file=.env server.js"代码使用旧版变量名 SUPABASE_SERVICE_ROLE_KEY。你可以在该变量中放入当前的 Supabase 密钥,而无需重命名代码。
在 package.json 旁边创建 .env:
OPENAI_API_KEY=your-openai-api-key
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=your-server-side-secret-key
PORT=3000创建 .gitignore:
.env
node_modules/Git 手册在忽略文件和良好习惯中涉及这个习惯。
将 Supabase 密钥保留在服务器上
永远不要用 VITE_ 前缀重命名服务密钥或将其移到 client.js 中。它具有提升的数据库访问权限。不要提交 .env 或在 ZIP 中共享它。
--env-file=.env 添加到启动脚本,用所有四个值创建文件,并将其保留在 Git 之外。Supabase 密钥始终保留在服务器上。一个包含 .env 的 .gitignore 是我在任何项目中创建的第一个文件,因为我用艰难的方式学到了这一点。 保留提供的模型
下载的 constants.js 使用 gpt-4o 进行答案生成和分类,使用 text-embedding-3-small 进行嵌入。本地设置不需要更改任何一个模型。除非 OpenAI 对你的项目拒绝了某个模型,否则保持它们不变。如果你后来替换了某个模型,测试完整的代理流程,并确认新的查询嵌入与存储的 Supabase 向量保持兼容。嵌入交换可能会悄悄失败:具有相同维数但不同向量空间的模型会返回较差的匹配,且没有错误,所以在更改嵌入模型后重新生成存储的向量。
运行代理
$ npm start打开 http://localhost:3000,或使用你在 .env 中设置的端口。用 Ctrl+C 停止服务器。
页面加载表明本地服务器正在运行。提出一个由课程数据涵盖的问题:有用的答案表明 Supabase 检索和 OpenAI 生成也在工作。如果答案失败,服务器终端会在链中打印第一个失败的调用:嵌入、检索或生成。RAG 章节解释了为什么代理首先在检索的课程数据中基础其答案。
npm start 并在浏览器中打开本地地址。页面加载证明服务器运行;完整答案还需要 OpenAI 和课程的 Supabase 数据,所以把那些视为两个单独的胜利。 故障排除
Missing OPENAI_API_KEY: 确认启动脚本包含 --env-file=.env,.env 在 package.json 旁边,变量名完全匹配。
Supabase 身份验证或关系错误: 确认 URL 和服务器端密钥属于同一项目,然后完成课程的模式和数据步骤。不要为此服务器操作用可发布密钥替换。
端口 3000 已在使用: 在 .env 中更改 PORT,重启服务器,并打开新端口。
页面加载但答案失败: 检查服务器终端的第一个提供商或数据库错误。本地启动本身不会验证任何外部服务。
.env,Supabase 错误指向项目或其数据,加载的页面且答案失败指向外部服务。先将症状与层匹配,修复通常会自己说出来。 
