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

在本地运行多模态项目 ​

使用本页在你的计算机上运行从多模态课程中提取的图像生成项目或视觉项目,并使用自己的 OpenAI 密钥。与 Scrimba 编辑器相比有三处不同:OpenAI 包需要更新,每个项目要求的模型已停用,index.js 中的密钥需要使用 Vite 的语法。

你首先需要什么 ​

安装支持的 LTS 版本的 Node.js。推荐使用 Node 24,它包含 npm。Node 22.12 之前的版本太旧,无法安装这些项目所需的包。

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

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

你还需要一个已设置付款信息的 OpenAI API 密钥。创建一个完成后会删除的密钥,并在 OpenAI 仪表板中为该项目设置较低的月度预算;下面的危险提示框说明了原因。对于图像生成项目,OpenAI 可能要求你在仪表板中验证你的组织,然后其图像模型才会响应。

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

然后在已设置付款信息的帐户上创建一个 OpenAI API 密钥,并设置较低的预算。如果你有图像生成项目,检查仪表板是否要求你验证组织。

Juno你首先需要什么 Node 和 npm 用来安装和运行项目,永远不会查看你的密钥。OpenAI 只在页面发送请求时检查密钥、付款和组织。
Juno你首先需要什么 两个项目都用 dangerouslyAllowBrowser: true 创建 OpenAI 客户端。没有这个选项,SDK 会拒绝在浏览器中运行,这本身就是 SDK 在告诉你这个设置仅适用于你的计算机。

安装包 ​

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

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

安装项目的包,然后用最新的 OpenAI 包替换它。课程中的版本来自 2023 年,早于你即将切换到的模型:

bash
$ npm install
$ npm install openai@latest

第一个命令报告 added 61 packages。第二个命令报告 added 1 package, removed 45 packages, changed 1 package,因为最新的 OpenAI 包需要少得多的辅助工具。在 Mac 上,第二个命令可能以关于 fsevents 的 allow-scripts 警告结束;这不会阻止项目运行。

Juno安装包 在包含 package.json 的文件夹中打开终端,运行 npm install,然后运行 npm install openai@latest。

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

Juno安装包 第一次安装会引入 Vite 和课程的 OpenAI 包。第二次会将该包替换为最新版本并写入 package.json,这样后续的 npm install 会保留它。
Juno安装包package.json 将 openai 固定到版本 4.20.0,所以只有显式的 @latest 才能移动它。Vite 列为 latest,所以它在每次全新安装时已经解析为最新版本。

改变模型 ​

打开 index.js。它告诉你有哪个项目:如果它调用 openai.images.generate,则是图像生成项目;如果它调用 openai.chat.completions.create,则是视觉项目。只进行与你的项目相关的改动。

图像生成。 项目要求使用 dall-e-3,它已被 OpenAI 停用。它的替代品 gpt-image-2 以 base64 文本形式而不是链接返回图片,所以 generatePoster 的两部分会改变。将请求从:

js
const image = await openai.images.generate({
   model: "dall-e-3",
   prompt
});

改为:

js
const image = await openai.images.generate({
  model: "gpt-image-2",
  prompt,
  size: "1024x1024",
})

然后将读取图像的行从:

js
const imgURL = image.data[0].url;

改为:

js
const imgURL = `data:image/png;base64,${image.data[0].b64_json}`;

它后面那行将 imgURL 放入页面的代码保持不变。

视觉。 项目要求使用 gpt-4-vision-preview,它已被 OpenAI 停用。改为:

js
model: "gpt-4-vision-preview",

改为具有图像功能的 gpt-4o-mini:

js
model: "gpt-4o-mini",

请求的其余部分(文本和图像链接)保持课程中的写法。

Juno改变模型 从 index.js 中的调用确定你有哪个项目。对于图像生成,改变模型,添加 size 行并改变 imgURL 行;使用旧的 .url 行,海报会显示为损坏的图像。对于视觉,改变那一行 model。
Juno改变模型 海报页面用 img 标签显示图片,它需要一个地址;数据 URL 在该地址中携带整个图片。视觉请求发送一条包含文本部分和图像链接的消息,gpt-4o-mini 会读取两者,所以只需改变它的名称。
Juno改变模型 GPT Image 模型返回 b64_json 而不是托管 URL,所以旧行写的是 src="undefined",catch 不会运行,因为什么都没有抛出错误。在视觉项目中,OpenAI 会自己下载图像链接,所以 localhost 地址或 images 中的文件作为纯 URL 无法到达。

将你的密钥提供给项目 ​

Scrimba 的编辑器为你填写 process.env.OPENAI_API_KEY。浏览器没有 process,Vite 也不创建一个,所以 index.js 顶部附近的密钥行必须从:

js
apiKey: process.env.OPENAI_API_KEY,

改为:

js
apiKey: import.meta.env.VITE_OPENAI_API_KEY,

Vite 只将名称以 VITE_ 开头的变量交给浏览器代码,这就是为什么名称获得这个前缀。下面的 dangerouslyAllowBrowser: true 行保持不变。

然后在 package.json 旁边创建 .env 并放入你的密钥:

dotenv
VITE_OPENAI_API_KEY=your-openai-api-key

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

txt
.env
node_modules/

到达 Git 仓库的密钥即使在你删除文件后也会保留在其历史中。Git 手册在 忽略文件和良好实践 中讲述了这个习惯。

此密钥在浏览器中可见

Vite 将每个 VITE_ 值写入发送到浏览器的代码中,所以任何打开此页面的人都可以读取你的密钥,每个海报或描述都会计费到你的帐户。将此版本保留在你自己的计算机上:永远不要部署或共享它,永远不要提交 .env。你发布的版本需要一个后端或无服务器函数来保持服务器上的密钥。

Juno将你的密钥提供给项目 将 apiKey 行改为 import.meta.env 形式,下面的行保持不变。然后在 package.json 旁边创建一个叫 .env 的文件,在一行中放入你的密钥,在 .gitignore 中列出 .env 这样 Git 就不会保存它。
Juno将你的密钥提供给项目 Vite 用 .env 中的值替换每个 import.meta.env.VITE_... 的读取。没有前缀的名称对浏览器代码隐藏,所以它作为 undefined 而不是错误到达。当项目运行时你保存 .env,Vite 会重启自己并服务新值。
Juno将你的密钥提供给项目 客户端在 index.js 的顶部构建,所以遗留的 process.env 会在它之后的任何代码运行前抛出错误。在图像生成项目中,这意味着表单的提交处理程序永远不会被附加。

启动项目 ​

启动开发服务器:

bash
$ npm start

Vite 可能首先打印一个以 (!) Your Vite config uses features 开头的警告。它不会阻止项目。在它下方,Vite 打印要打开的地址:

text
  VITE v8.3.4  ready in 1825 ms

  ➜  Local:   http://localhost:5173/

打开确切的 Local 地址。如果你在项目运行时创建或保存 .env,终端会显示 [vite] .env changed, restarting server...,页面会使用新密钥。

图像生成。 页面标题为 Film-Fusion。输入电影标题,选择艺术风格,点击 Generate Poster。表单清空,下面的框显示 Generating poster for "…" in the style of …。当 OpenAI 回复时海报会替换那行,这可能需要一段时间。如果框显示 Sorry, an error occurred while generating the poster.,原因在浏览器控制台中。

视觉。 项目在页面打开时立即发送请求,所以页面在 OpenAI 查看图片时保持空白。当答案到达时,建筑物的图片出现,答案打印在浏览器控制台中,而不是页面上。控制台折叠显示它:点击它旁边的箭头,然后点击 message 旁边的箭头,以读取 content(描述)。每次重新加载都会发送新请求,每次你保存 index.js 时 Vite 都会重新加载页面。

要读取控制台,打开你的浏览器开发者工具(F12 或在 Mac 上的 Chrome 中按 Cmd+Option+J)并选择 Console 标签。关于 favicon.ico 的红色 404 是无害的;下面的故障排除会匹配其他消息。

用 Ctrl+C 停止项目。

Juno启动项目 运行 npm start,忽略如果出现的配置警告,打开 Local 地址。

对于图像生成,提交标题和风格并等待海报。对于视觉,打开控制台并等待答案。如果都没有出现,在控制台中读取红色错误。

Juno启动项目 页面打开只证明 Vite 有效。海报或描述需要来自你的浏览器到 OpenAI 的请求才能成功,所以缺少结果是密钥、帐户或模型问题,不是安装问题。
Juno启动项目 视觉请求是顶级的 await,没有 try/catch。失败会在它添加图片前停止模块,这就是为什么失败的请求会使页面空白并在控制台中放置未捕获的错误。

故障排除 ​

Generate Poster 只清空表单: 地址添加了 ?art-styles=… 但没有出现 Generating poster 行。代码在页面加载时停止,在按钮被连接前;控制台会说出接下来两个问题中哪一个。

控制台说 process is not defined: index.js 中的 apiKey 行仍读取 process.env。将其改为 import.meta.env 形式并保存。

控制台说 Missing credentials: 浏览器没有密钥。检查 .env 是否在 package.json 旁边,并且名称是否完全是 VITE_OPENAI_API_KEY,然后保存。消息建议 OPENAI_API_KEY;保留 VITE_ 名称。

控制台说 401 Incorrect API key provided: 密钥到达了,但 OpenAI 不接受它。从你的 OpenAI 仪表板中再次复制它,检查它是否未被删除。

控制台说 429 You exceeded your current quota: 密钥有效,但帐户没有可用的信用。在 OpenAI 仪表板的"Billing"下添加信用,然后重试。

控制台提到组织验证或模型访问: 你的帐户还不能使用图像模型。在 OpenAI 仪表板中验证你的组织,等待它生效,然后重试。

海报是损坏的图像: imgURL 行仍读取 .url。将其改为上面所示的 b64_json 行。

控制台说模型不存在: 检查 index.js 是否要求 gpt-image-2 或 gpt-4o-mini,而不是旧模型。OpenAI 计划在 2027 年 1 月 14 日停止提供 gpt-4o-mini;之后,使用其弃用页面命名的替代品。

Juno故障排除 在控制台中找到红色错误,跳过 favicon.ico 那个,并将其与上面的粗体标题匹配。大多数这些都是 index.js 或 .env 中仍需改变的一行。
Juno故障排除process is not defined 和 Missing credentials 在任何请求离开前停止页面。401、429、验证或模型错误是 OpenAI 拒绝一个已发出的请求。
Juno故障排除401 意味着请求到达 OpenAI 时用的是它拒绝的密钥,所以 Vite 的替换有效。Missing credentials 来自 SDK 本身:没有密钥,它在构建客户端时抛出并不发送任何东西。