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

在本地运行 Context Engineering ​

用这个页面来运行你从 Context Engineering 模块中提取的总结挑战,用你自己的 OpenRouter 密钥观看它总结一段长对话。代码下载即用:你只需要安装依赖包,添加一个包含密钥和模型的 .env 文件,然后启动它。

准备工作 ​

安装受支持的 Node.js LTS 版本。推荐使用 Node 24,它包含 npm。这个项目使用 Vite 7,需要 Node 22.12 或更新版本。

检查这两个命令都能工作。你的版本号可能不同:

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

如果 node --version 显示的版本低于 v22.12.0,请在继续之前安装 Node 24。

你还需要一个 OpenRouter API 密钥,并在 OpenRouter 账户中有一点信用额度,因为这个应用会为每条总结和回复请求 OpenRouter。创建一个完成后将删除的密钥,并在创建时给它设置较低的信用额度限制:这个项目直接从浏览器调用 OpenRouter,所以密钥会出现在页面中。

Juno准备工作 安装 Node.js 24(包含 npm),并检查 node --version 是否打印 v22.12.0 或更高版本。

然后在 OpenRouter 账户中添加一点信用额度(一美元可以进行很多次总结),并创建一个信用额度限制较低的密钥。这个项目只需要这一个密钥。

Juno准备工作 这个应用会发起两种 OpenRouter 请求:一种要求模型总结较早的消息,另一种流式传输对你的消息的回复。两者都从你的浏览器用同一个密钥发出,所以密钥的信用额度限制了这个页面能花费的金额。
Juno准备工作 Node 版本要求来自 Vite 7,而不是这个应用:它的 package.json 要求 Node 20.19 或 22.12 及更新版本,而 Node 20 已经生命周期结束,所以从 22.12 开始。

安装依赖包 ​

在提取的文件夹中打开终端。这个文件夹包含 package.json 和 main.js:

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

npm ci 安装 package-lock.json 中列出的精确版本。npm 完成后会报告它添加了多少个包:

text
added 29 packages, and audited 30 packages in 6s

npm 也可能报告漏洞并建议 npm audit fix。暂时忽略它们:修复可能会改变这个课程所基于的包版本。npm 也可能警告关于安装脚本的问题;这里不会造成任何影响。

Juno安装依赖包 在包含 package.json 的文件夹中打开终端,然后运行 npm ci。npm 最后会说它添加了多少个包,并会出现一个 node_modules 文件夹。

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

Juno安装依赖包npm ci 读取 lockfile 而不是重新解析版本,所以你会得到与挑战编写时相同的 Vite、AI SDK 和 OpenRouter 提供程序。如果 package.json 和 lockfile 不一致,它也会拒绝运行,这样可以及早告诉你文件是否被改动了。
Juno安装依赖包 npm 列出的漏洞在 vite 及其下面的构建工具中,以及在 ai 和 dompurify 中。这里它们只会影响你在自己电脑上学习时提供的页面;更新它们是一个单独的改动,会让你偏离课程使用的版本。

将密钥和模型添加到 .env ​

这个项目读取两个值:OPENROUTER_KEY 和 MODEL_ID。Scrimba 的编辑器为你填写它们;在你的电脑上它们要放在一个文件中。在 package.json 旁边创建 .env:

dotenv
OPENROUTER_KEY=your-openrouter-key-here
MODEL_ID=mistralai/ministral-3b-2512

两个名字都要完全按照所示保留,前面不加 VITE_:项目的 vite.config.js 读取这两个名字并将它们传递给浏览器代码。mistralai/ministral-3b-2512 是 OpenRouter 上的低成本模型。任何 OpenRouter 模型 ID 都可以;要完全复制。

在 package.json 旁边创建 .gitignore 并添加:

txt
.env
node_modules/

一个到达 Git 仓库的密钥即使在你删除文件后也会留在其历史记录中。Git 手册在忽略文件和良好习惯中介绍了这个习惯。

这个密钥在浏览器中是可见的

vite.config.js 将两个值都写入它发送到浏览器的代码中,所以任何打开这个页面的人都能读到你的密钥。请将这个版本保存在自己的电脑上:千万不要部署或分享它,也不要提交 .env。你发布的版本需要一个后端或无服务器函数来在服务器上保存密钥。

Juno将密钥和模型添加到 .env 创建一个名为 .env 的文件放在 package.json 旁边,两行内容:你的密钥放在 OPENROUTER_KEY= 后面,模型放在 MODEL_ID= 后面。然后在 .gitignore 中列出 .env,这样 Git 就永远不会保存它。

你不需要改动任何 JavaScript 文件。

Juno将密钥和模型添加到 .envvite.config.js 加载 .env 中的每个值,然后为 main.js 和 utils.js 中的浏览器代码定义 process.env.OPENROUTER_KEY 和 process.env.MODEL_ID。这就是为什么这些名字不需要 VITE_ 前缀:config 文件会自己把它们传递下去。
Juno将密钥和模型添加到 .env 在开发服务器中,Vite 在你的模块运行前在页面中的 process.env 对象上设置定义的值,所以源代码中的 process.env 读取按写的方式工作。在构建时,Vite 用值本身替换每次读取。无论哪种方式,密钥都是浏览器加载内容中的纯文本。

启动应用并发送消息 ​

启动开发服务器:

bash
$ npm start

Vite 会打印要打开的地址:

text
  VITE v7.2.2  ready in 157 ms

  ➜  Local:   http://localhost:5173/

打开确切的 Local 地址。页面会打开一段已经存在的长对话,下面的计数器显示 26294 total tokens 和 26294 context tokens。应用在上下文超过 20,000 个 token 时进行总结,所以你的第一条消息就足够了。

输入任何消息并发送。当 OpenRouter 写总结时,应用会显示正在总结对话。工作正常时,计数器下方会出现一张上下文总结卡片(点击它可以阅读总结),上下文 token 计数会大幅下降到低于总数,你的消息回复就会出现。

如果你在完成 summary.js 中的 splitForSummary 和 generateSummary 之前下载了挑战,你的第一条消息会卡在这里:应用一旦总结就会调用这两个函数,控制台会显示原因。

如果正在总结对话一直显示在屏幕上,发送按钮保持灰色,打开你浏览器的开发工具(F12,或在 Mac 的 Chrome 中按 Cmd+Option+J),查看控制台标签页。原因会打印在那里,而不是页面上;下面的故障排除会匹配每条信息。favicon.ico 的红色 404 是无害的。

改动 .env 后不需要重新启动任何东西:当你保存它时,Vite 会自己重新启动,打开的页面会用新值重新加载。用 Ctrl+C 停止项目。

Juno启动应用并发送消息 运行 npm start,打开 Local 地址,并发送任何消息。等待上下文总结卡片和回复出现。

如果一直停在"正在总结对话",打开浏览器开发工具中的控制台,查找提到 OpenRouter 或 API 密钥的红色错误。

Juno启动应用并发送消息 页面打开只能证明 Vite 能工作。总结需要你浏览器对 OpenRouter 的请求成功,所以一个卡在"正在总结对话"的页面是密钥、信用或模型问题,而不是安装问题。
Juno启动应用并发送消息generateSummary 在 handleUserMessage 中的 try 之前运行,所以被拒绝的总结请求在控制台中变成未捕获的 promise 拒绝,输入框永远无法再启用。保存对 .env 的修复会重新加载页面并释放它。回复本身中的错误(在总结成功之后)会在聊天中显示为**错误:**。

故障排除 ​

控制台显示 OPENROUTER_KEY env variable is not set,然后是 OpenRouter API key is missing: 浏览器没有密钥。检查 .env 是否在 package.json 旁边,名字是否完全是 OPENROUTER_KEY 和 MODEL_ID,然后保存。页面会自动重新加载。

控制台显示 401 和 User not found. 或 Missing Authentication header: 密钥到达了 OpenRouter,但 OpenRouter 没有接受它。从你的 OpenRouter 账户再次复制它,并检查它是否未被删除。Missing Authentication header 通常意味着 .env 仍然保存着示例文本而不是你的密钥。

控制台显示 402: 密钥有效,但你的账户或密钥的信用额度限制没有信用了。在 OpenRouter 中添加信用,或提高密钥的限制,然后重新加载页面并重新发送。

控制台说模型无效或找不到: 检查 .env 中的 MODEL_ID 行是否与 OpenRouter 上模型页面中的完全一致,包括斜杠前的部分。

Juno故障排除 在控制台中找到提到密钥、401 或 402 的红色错误,并将其与上面的粗体行匹配。编辑 .env 并保存后,等待页面重新加载,然后再发送一条消息。
Juno故障排除 分清两个问题:Vite 将值放入页面,以及 OpenRouter 接受密钥、信用和模型。缺失密钥会在浏览器中失败,甚至在发送任何请求之前;状态码意味着请求到达了 OpenRouter。
Juno故障排除 AI SDK 的 OpenRouter 提供程序在 apiKey 未定义时会在发送任何内容之前抛出 API key is missing。一旦请求发出,状态码就是 OpenRouter 的:401 表示密钥,402 表示信用,模型错误表示 ID。