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

在本地运行多模态项目

使用本页面来运行任一多模态项目:图像生成或图像理解。两个项目都需要相同的 Vite 密钥改动和相同的 OpenAI SDK 更新。之后,按照你拥有的项目对应的修复步骤进行。密钥改动是这些课程中所有提取的浏览器项目都需要的;在本地运行 Chef Claude 将其应用于具有两个提供者路由的 React 项目。

你需要先准备的东西

安装受支持的 Node.js LTS 版本。推荐 Node 24,它包含 npm。该项目会安装最新的 Vite,需要 Node 22.12 或更新版本。

检查这两个命令是否可用:

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

你需要一个 OpenAI API 密钥,该密钥需要配置计费和访问你使用的模型。图像生成访问权限可能需要组织验证。

使用一个临时密钥并设置低支出限额。两个项目都会从浏览器代码发起付费的 OpenAI 请求,所以任何打开浏览器开发者工具的人都能读到这个密钥。

Juno你需要先准备的东西 安装 Node.js LTS,然后运行 node --versionnpm --version。每个命令都应该打印一个版本号。

接下来,创建一个配置了计费和低支出限额的临时 OpenAI 密钥。如果你计划运行图像生成项目,请在开始前检查你的组织是否需要验证。

Juno你需要先准备的东西 Vite 可以在你的 OpenAI 项目获得计费和模型访问权限之前很久就开始提供页面,所以页面能加载这件事并不能证明账户的任何问题。第一次付费请求才能证明密钥有效。

将这个密钥的支出限额设置得较低,这样万一出错损失也不会很大。

Juno你需要先准备的东西 本地打包和 OpenAI 访问是独立失败的,所以把它们当作分开的前置条件。浏览器会接收这个密钥,这意味着打开这个页面的所有人都能获得它。

现在就设置支出限额,在任何类似于部署的环节之前,把请求移到服务器。

打开并准备项目

在包含 package.json 的提取文件夹中打开终端:

bash
$ cd path-to-your-downloaded-project
$ npm install
$ npm install openai@latest

第二个 install 命令会在你修改模型之前用当前的 SDK 替换掉旧的课程版本。

检查 index.js 看你有哪个项目。图像生成项目会调用 openai.images.generate 并构建一个包含电影标题和艺术风格的海报表单。视觉项目会用 gpt-4-vision-preview 调用 openai.chat.completions.create,并且有一个 images/ 文件夹。

package.json 旁边创建 .env.gitignore

dotenv
VITE_OPENAI_API_KEY=your-openai-api-key
txt
.env
node_modules/

.gitignore 条目会将两样东西排除在你用这个文件夹创建的任何仓库之外:你的密钥和 npm 随时可以重新构建的 node_modules 文件夹。忽略文件和良好习惯 涵盖了更广泛的这个习惯。

index.js 中,将 OpenAI 客户端密钥从:

js
apiKey: process.env.OPENAI_API_KEY,

改为:

js
apiKey: import.meta.env.VITE_OPENAI_API_KEY,

保留下面的 dangerouslyAllowBrowser: true 这一行不变。SDK 没有它就拒绝在浏览器中运行。

密钥被包含在前端

这仅在本地学习并使用受限密钥时才可接受。图像请求会消耗金钱。不要部署或分享这个仅限浏览器的版本;先把 OpenAI 请求移到后端。

Juno打开并准备项目 打开包含 package.json 的提取文件夹,安装它的包,然后在顶部安装当前的 OpenAI SDK。

把你的临时密钥放在 .env 中,让 .gitignore 把这个文件排除在 Git 之外。然后改动 index.js 中的那一行 apiKey,保留下面的这一行不变。

Juno打开并准备项目 两个项目需要相同的两个编辑:SDK 更新和 Vite 密钥替换。Vite 在启动时读取 .env,所以改动这个文件后要重启它。

每个 VITE_ 值都会被发送到浏览器,所以这个前缀表示一个值是公开的而不是隐藏的。

Juno打开并准备项目 先升级 SDK。课程固定了 OpenAI 4.20,它早于 gpt-image 模型,所以用旧包调用新模型可能会以看起来像你自己代码中的错误的方式失败。

只有在那之后才替换已停用的模型 ID 和响应处理。import.meta.env 将密钥移到包中;它不会保护它。

修复图像生成项目

课程快照调用了已停用的 dall-e-3 模型并期望一个托管的图像 URL。按照当前的 OpenAI 图像生成指南,将其图像请求改为使用 gpt-image-2

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

该模型以 base64 数据而不是 URL 形式返回图像。代码读取 image.data[0].url 的地方:

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

改为从返回的 base64 图像构建一个 PNG 数据 URL:

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

保持将 imgURL 放入海报输出的那一行不变。

Juno修复图像生成项目 把请求指向 gpt-image-2,然后改动 imgURL 行,让它从 b64_json 构建一个 PNG 数据 URL。

一起做这两个改动。如果你改动模型但保留 .url,海报就不会出现。

Juno修复图像生成项目 两样东西改变了:你请求的模型和承载图像返回的字段。请求 gpt-image-2 并读取 b64_json 而不是 .url

如果图片损坏了,改动任何东西之前先检查 data:image/png;base64, 前缀。

Juno修复图像生成项目 响应在 JSON 内部承载图像而不是指向提供者托管的文件,所以页面必须在 img 标签可以显示它之前把它包装在明确的数据 URL 中。

其余的渲染代码保持课程写的样子。

修复视觉项目

在 Vision Part 2 项目中,替换已停用的模型 ID:

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

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

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

现有的消息格式仍然可以发送文本和图像输入,所以请求的其余部分保持不变。

Juno修复视觉项目gpt-4o-mini 替换已停用的视觉模型,并完全按原样保留文本和图像消息。

这里只有模型 ID 改变,不是请求的形状。

Juno修复视觉项目 这个修复只替换模型,不改动其他东西;响应形状改动属于图像生成,不属于这里。

替换后调用仍然失败的话,在检查你自己的消息代码之前检查账户访问。

Juno修复视觉项目 Chat Completions 仍然接受混合 text 部分和 image_url 部分的内容数组,所以课程的请求形状原封不动地承载到 gpt-4o-mini

在重写任何部分之前,先缩小请求的哪一部分失败。

运行任一项目

bash
$ npm start

打开 Vite 打印的 Local URL。

在图像生成项目中,输入一个电影标题,选择一个艺术风格,然后选择 Generate Poster。页面在请求运行时显示 "Generating poster for...",然后显示海报。如果请求失败,页面显示 "Sorry, an error occurred while generating the poster.",浏览器控制台会显示错误。

视觉项目在页面加载后立即发送请求。页面显示正在分析图像,模型的描述出现在浏览器控制台,而不是页面上。每次页面加载都会发送一个新的付费请求,包括 Vite 在你保存 index.js 时触发的重新加载。

改动 .env 后重启,用 Ctrl+C 停止项目。

Juno运行任一项目 运行 npm start 并打开 Vite 打印的 Local URL。

对于图像生成,提交电影标题和艺术风格并等待海报。对于视觉,打开浏览器控制台:模型的描述会出现在那里。每次尝试都是一次付费请求,所以在开始点击之前决定好你想测试什么。

Juno运行任一项目 Vite 启动证明了适配的包能编译;它对账户一无所知。一个实时请求在单一调用中检查密钥、计费、模型访问和项目的响应处理。

任何 .env 编辑后重启 Vite,否则旧值会继续被提供。

Juno运行任一项目 两个项目的成功信号不同。图像生成必须接收 base64 并将其渲染为数据 URL;视觉在模块加载时运行请求并将第一个选择记录到控制台。

因为视觉请求在每次加载时运行,所以每次重新加载都被计费。再尝试之前读一下控制台。

故障排除

process is not definedimport.meta.env.VITE_... 形式替换 index.js 中剩余的 process.env 密钥读取。

生成的图像损坏: 确认代码读取 b64_json 并添加 data:image/png;base64, 前缀而不是读取 .url

模型不可用: 确认 OpenAI 项目中的计费、组织验证和模型访问。提供者可用性可能因账户而异。

视觉页面保持空白: 页面仅在请求成功后添加图像,所以空白页面表示请求失败。阅读浏览器控制台中的错误。如果它没有指向密钥或模型,先向 gpt-4o-mini 发送仅文本消息;那里的成功确认你的账户可以使用该模型,所以接下来要检查的是消息的图像部分。

请求有效但页面保持不变: 检查浏览器控制台中是否有渲染错误,并将返回的字段与上面相关的修复进行比较。

Juno故障排除 按顺序检查这些:修复任何剩余的 process.env 读取,确认模型,然后检查图像生成的 b64_json

对于任一项目,浏览器控制台显示错误。这里大多数失败都是一个未完成的编辑。

Juno故障排除 分离 Vite 替换、账户访问、响应形状和页面渲染;每一层都独立失败。请求可能成功但仍然渲染不正确。

在编辑任何东西之前,先将症状匹配到一层。

Juno故障排除 在改动任何 UI 代码之前先读取提供者响应,因为它显示模型返回了什么,而渲染的页面不显示。

分开保存图像生成输出和视觉消息处理;它们的失败看起来相似但有不同的原因。