Skip to content
This page has been auto-translated and may contain errors.View in English

在本地运行代码 ​

使用本页面在你的计算机上运行提取的 Learn AI Agents 项目,并使用你自己的提供商密钥从 OpenSwap agent 获取答案。这与 Scrimba 有两个不同之处:你需要在 .env 文件中给项目提供三个 AI 值,而不是在 Scrimba 的设置中,项目在你修改文件后不会自动重新加载。无论你是否执行这些操作,Scrimba 版本都会继续工作。

你首先需要什么 ​

安装受支持的 LTS 版本的 Node.js。推荐使用 Node 24,Node 22 也可以工作,两者都包含 npm。检查这两个命令都输出一个版本号。你的版本号可能不同:

bash
$ node --version
v24.18.0
$ npm --version
11.18.0

你还需要在 Scrimba 的环境设置中保存的三个值:AI_KEY、AI_MODEL 和 AI_URL。如果你已经没有这些值了,或者从未设置过,提供商设置会指导你从 OpenAI 或 OpenRouter 获取密钥。

Juno你首先需要什么 安装 LTS 版本的 Node.js(其中包含 npm),并检查 node --version 和 npm --version 都输出一个版本号。

然后准备好你从 Scrimba 保存的密钥、模型和 URL,随时可以复制。这是这个项目唯一需要的值。

Juno你首先需要什么 这个项目有两部分:一个 Express 服务器保存你的密钥并调用提供商,一个 Vite 服务器将页面发送到你的浏览器。一个命令启动两者,三个值只由 Express 部分读取。
Juno你首先需要什么environment.js 用 node:process 中的 loadEnvFile 加载 .env,这是 Node 在 20.12 中添加的。在更旧的 Node 上,它会停止并显示一条命名该版本的消息,而不是以空值启动,所以这条消息总是意味着改变 Node,而不是 .env。

安装包 ​

在提取的项目文件夹中打开终端。这是包含 package.json、server.js 和 environment.js 的文件夹:

bash
$ cd path-to-your-extracted-project

安装包:

bash
$ npm install
added 106 packages, and audited 107 packages in 6s

包的数量取决于课程。npm 也可能列出漏洞,或警告某些包有安装脚本。这些都不会阻止项目运行。

Juno安装包 在包含 package.json 的文件夹中打开终端,然后运行 npm install。它最后会说添加了多少个包。

如果 npm 说找不到 package.json,那你在错误的文件夹里。

Juno安装包 下载内容包括 package-lock.json,所以 npm install 会获得课程在 Scrimba 上运行时使用的相同包版本。它安装的所有内容都放在这个文件夹的 node_modules 中,包括启动两个服务器的工具。
Juno安装包npm start 运行 concurrently,它只存在于这个文件夹的 node_modules 中。在安装之前启动会失败,显示 concurrently: command not found,而不是关于你的代码的错误。

创建你的 .env 文件 ​

项目会为你创建这个文件。启动它一次:

bash
$ npm start

第一次,服务器找不到值,在 package.json 旁边创建 .env,然后停止并显示这条消息:

text
Error: Missing environment variables: AI_KEY, AI_MODEL, AI_URL.
Created .env with the required variable names. Complete it, then restart the app.
Setup guide: https://docs.scrimba.com/ai-agents/running-locally

Vite 继续运行并打印一个地址,但页面还不能工作。按 Ctrl+C 停止所有内容,然后打开 .env。它的每个值有一个空行,末尾有一个注释的端口行:

dotenv
AI_KEY=
AI_MODEL=
AI_URL=
GITHUB_TOKEN=
# PORT=3001

将你的三个值填入每个 = 后面,不要有空格或引号。使用 OpenAI(课程默认)时,看起来像这样:

dotenv
AI_KEY=your-api-key-here
AI_MODEL=gpt-5.4-nano
AI_URL=https://api.openai.com/v1
GITHUB_TOKEN=
# PORT=3001

GITHUB_TOKEN 只出现在检查 GitHub 上的项目的课程中。你可以将其留空;GitHub 然后用更低的速率限制回复。让 # PORT=3001 这一行保持原样。

永远不要提交你的 .env 文件

如果你把这个项目放在 Git 中,在你的第一次提交之前,在 package.json 旁边创建一个 .gitignore,这样你的密钥和已安装的包就不会进入存储库:

txt
.env
node_modules

到达存储库的密钥即使在你删除文件后也会保留在其历史记录中;唯一的解决方法是在你的提供商处删除该密钥并创建一个新的。Git 手册在忽略文件和良好习惯中涵盖了这个习惯。

Juno创建你的 .env 文件 运行一次 npm start 使项目创建 .env,按 Ctrl+C,然后将你的密钥、模型和 URL 复制到三个空行中并保存。

如果它说下次又创建了 .env,那你的文件名不同,比如 .env.txt。

Juno创建你的 .env 文件 在 Scrimba 上,编辑器将这些值交给运行的项目。这里,environment.js 首先在 server.js 中运行,读取 .env,并在所需值为空时拒绝启动服务器,所以缺失的值会在任何请求之前出现。
Juno创建你的 .env 文件 该文件仅在不存在名为 .env 的文件时创建,所以保存为 .env.txt 的文件会被忽略,一个新的空 .env 会出现在其旁边。这些值在启动时读取一次,这就是为什么每次编辑都需要重启。

启动应用并发送请求 ​

再次启动项目:

bash
$ npm start

两个服务器都输出到同一个终端。你的三个值的勾号和两个地址表示两者都已启动:

text
Environment check:
✓ AI_KEY: configured
✓ AI_MODEL: gpt-5.4-nano
✓ AI_URL: https://api.openai.com/v1
○ Optional environment not configured: GITHUB_TOKEN
OpenSwap server running at http://localhost:3001

  VITE v6.4.3  ready in 150 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose

打开 Local 地址,不是 3001 的那个,并像在课程中一样使用页面。在 OpenSwap 课程中,选择一个软件名称或输入一个请求,然后单击Swap it。当 agent 工作时按钮显示Loading...,出现答案意味着你的密钥、模型和 URL 都可以工作。如果你的页面有一个Run Agent按钮,单击它;agent 的输出会出现在终端中,而不是在页面上。

如果页面显示错误,或什么都没有发生,原因在终端中;下面的故障排除会匹配每条消息。

项目不会自动重新加载。在你修改任何文件后,按 Ctrl+C,再次运行 npm start,然后刷新浏览器。

Juno启动应用并发送请求 运行 npm start,打开 Local 地址,并发送一个请求。

如果页面显示错误,查看终端中你单击时出现的行,并在故障排除标题下找到它们。

Juno启动应用并发送请求 页面只调用 Vite 服务器上以 /api 开头的地址,Vite 将它们转发给 Express。Express 使用你的密钥将请求发送给你的提供商,所以密钥永远不会到达浏览器。
Juno启动应用并发送请求 每个服务器故障都在浏览器中变成相同的通用消息:路由使用 console.error 记录真实错误并以 500 响应。Vite 的文件监视被关闭,所以它继续提供它发送的每个文件的第一个版本,Express 从不重新加载,这就是为什么改变需要重启。

当端口 3001 被占用时 ​

Express 在端口 3001 上监听。如果其他东西已经使用它了,通常是你在另一个终端中留下的另一个课程,服务器仍然会打印其 server running at http://localhost:3001 行,然后在没有错误的情况下退出。页面的请求然后到达其他程序:你可能会看到一个错误,比如 is not valid JSON,或来自另一个课程的答案。

用 Ctrl+C 在其终端中停止另一个项目。要运行两者,给这个项目另一个端口:打开 .env,从最后一行中删除 #,并更改号码:

dotenv
PORT=3101

按 Ctrl+C 并再次运行 npm start。服务器行现在显示 3101,Vite 将页面的请求发送到那里,因为它读取同一行。

Vite 自己的端口会自动移动。如果 5173 被占用,Vite 会打印 Port 5173 is in use, trying another one... 和一个 Local 地址,比如 http://localhost:5174/,所以总是打开它打印的地址。

Juno当端口 3001 被占用时 如果页面显示错误或另一个课程的答案,查找另一个仍在运行 npm start 的终端,并用 Ctrl+C 停止它。

要保持两者都运行,将这个项目的 .env 中的 # PORT=3001 更改为 PORT=3101 并重启。

Juno当端口 3001 被占用时 Express 和 Vite 的转发都从同一个 .env 读取 PORT,所以改变那一行会移动两者。Vite 自己的端口是独立的,不需要设置。
Juno当端口 3001 被占用时 在 Express 5 中,app.listen 将侦听错误传递给其回调,这个项目的回调忽略该参数并记录运行行。然后该过程没有任何东西可以保持它活着而退出,所以终端显示成功,而 Vite 转发到无论谁拥有 3001。

如果某些东西不工作 ​

concurrently: command not found(在 Windows 上,'concurrently' is not recognized):包未安装在此文件夹中。在那里运行 npm install,然后运行 npm start。

Missing environment variables: 后跟名称:.env 中的这些行仍然是空的,或文件未保存。填入它们并再次启动。

**它说 Created .env 再次,尽管你创建了一个:**你的文件在 package.json 所在的文件夹中名称不完全是 .env。另存为 .env.txt 的文件不计数。将你的值放入新的 .env 并删除另一个文件。

页面显示 Unexpected end of JSON input: Express 服务器未运行,终端显示 [vite] http proxy error。向上滚动到 Vite 行上方的第一个错误;它说为什么 Express 停止了。

终端显示 401 Incorrect API key provided(OpenAI)或 401 Missing Authentication header(OpenRouter):提供商拒绝了 AI_KEY。从你的提供商再次复制密钥,保存 .env 并重启。

**终端显示 429 和 exceeded your current quota:**密钥工作,但账户没有信用可花费。用你的提供商添加信用并重试。

终端显示模型未找到错误: AI_MODEL 和 AI_URL 属于不同的提供商,例如 OpenAI 模型 ID 与 OpenRouter 的 URL。切换提供商时一起更改所有三个值。

"Local environment loading requires Node.js 20.12 or newer." 你的 Node 对于项目的 .env 加载器来说太旧了。从 nodejs.org 安装当前 LTS 版本,然后再次运行 npm start。

在带有聊天侧边栏的课程中,失败的请求可能会留下一个名为New conversation的聊天。它是空的,没有害处。

**一切看起来都很对,但仍然失败了。**把它带到课程 Discord,告诉我们你运行了什么以及返回了什么。设置问题几乎总是特定于一台机器的,通常有人已经遇到过你的问题。

Juno如果某些东西不工作 首先阅读终端:找到以 Error 开头的第一行或显示像 401 这样的数字的行,并将其与上面的粗体标题匹配。在每次更改 .env 后用 npm start 重启。
Juno如果某些东西不工作 故障按顺序出现:包缺失、值缺失、Express 未运行,然后提供商拒绝密钥、账户或模型。你遇到的第一个告诉你回到哪一步。
Juno如果某些东西不工作 401 意味着 Express 以所有三个值启动并到达 AI_URL 的提供商,所以 .env 加载了;那个提供商拒绝了密钥。来自另一个提供商的密钥得到相同的 401,这就是为什么三个值作为一个集合改变。