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

Rodando Multimodality localmente

Use esta página para rodar um dos projetos Multimodality extraídos: geração de imagens ou compreensão de imagens. Ambos precisam da mesma adaptação de chave do Vite e atualização do SDK do OpenAI. Depois disso, siga o conserto do projeto que você tem. A adaptação de chave é a mesma que todo projeto do curso extraído precisa; Rodando Chef Claude localmente aplica isso a um projeto React com duas rotas de provider.

O que você precisa primeiro

Instale uma versão LTS suportada do Node.js. Node 24 é recomendado e inclui npm.

Verifique se ambos os comandos funcionam:

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

Você precisa de uma chave de API do OpenAI com cobrança ativa e acesso ao modelo que vai usar. O acesso à geração de imagens pode exigir verificação da organização.

Use uma chave temporária com limite de gastos baixo. Ambos os projetos fazem requisições pagas ao OpenAI a partir do código do navegador, onde a chave pode ser inspecionada.

JunoO que você precisa primeiro Instale Node.js LTS e configure uma chave temporária do OpenAI com cobrança ativa e limite de gastos baixo. A geração de imagens também pode exigir verificação da organização, então verifique isso antes de se sentar para construir. Passei uma noite inteira em uma chave sem cobrança anexada, e as mensagens de erro nunca mencionaram isso!
JunoO que você precisa primeiro Vite pode servir a página muito antes do seu projeto OpenAI ter cobrança ou acesso ao modelo, então uma página que carrega não prova nada sobre a conta. A primeira requisição de imagem paga é o que prova que a chave funciona. Mantenha essa chave restrita a um limite de gastos baixo para que um erro saia barato.
JunoO que você precisa primeiro Empacotamento local e acesso ao OpenAI falham independentemente, então trate-os como pré-requisitos separados. O navegador recebe a chave, o que significa que qualquer um com DevTools também recebe. Restrinja o orçamento agora e mova a requisição para o servidor antes de qualquer coisa que se pareça com uma implantação; revogueei chaves por menos.

Abra e prepare o projeto

Abra um terminal na pasta extraída que contém package.json:

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

A segunda instalação atualiza o SDK antigo do curso antes de usar as APIs de imagem atuais.

Crie .env e .gitignore ao lado de package.json:

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

As entradas .gitignore mantêm sua chave e a pasta node_modules reconstruível fora de qualquer repositório que você criar; ignorando arquivos e bons hábitos cobre o hábito mais amplo.

Em index.js, altere a chave do cliente OpenAI de:

js
apiKey: process.env.OPENAI_API_KEY,

para:

js
apiKey: import.meta.env.VITE_OPENAI_API_KEY,

A chave está incluída no frontend

Isso é aceitável apenas para aprendizado local temporário com uma chave restrita. Requisições de imagem podem custar dinheiro. Nunca implante ou compartilhe esta versão somente do navegador; mova a requisição do OpenAI para um backend primeiro.

JunoAbra e prepare o projeto Abra a pasta extraída que contém package.json, instale seus pacotes e depois instale o SDK OpenAI atual por cima. Sua chave temporária vai em .env, e .gitignore mantém esse arquivo fora do Git. Uma chave que nunca cai em um commit é uma chave que você nunca precisa substituir!
JunoAbra e prepare o projeto Ambos os projetos precisam das mesmas duas edições: a atualização do SDK e a substituição de chave do Vite. Vite lê .env na inicialização, então reinicie-o após alterar o arquivo. E cada valor VITE_ é enviado para o navegador, então trate o prefixo como um switch de publicação, não como um lugar de ocultação.
JunoAbra e prepare o projeto Atualize o SDK primeiro: a versão do curso é anterior à forma de requisição gpt-image, então uma chamada de novo modelo através do pacote antigo falha de maneiras que parecem seu bug em vez de um intervalo de versão. Só depois troque o modelo aposentado e o tratamento de resposta. Uma vez fiz isso na outra ordem e passei uma hora auditando código que nunca foi o problema.

Conserte o projeto de geração de imagens

O snapshot do curso chama o modelo aposentado dall-e-3 e espera uma URL de imagem hospedada. Seguindo o guia atual de geração de imagens do OpenAI, altere sua requisição de imagem para usar gpt-image-2:

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

Onde o código lê image.data[0].url, substitua por uma data URL feita a partir da imagem base64 retornada:

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

Mantenha a atribuição ou markup ao redor do seu arquivo extraído.

A string base64 é a imagem inteira embutida na resposta, então espere payloads de um megabyte ou mais. Uma versão com um backend salvaria a imagem no servidor e entregaria à página uma URL curta em vez de uma data URL longa.

JunoConserte o projeto de geração de imagens Aponte a requisição para gpt-image-2 e transforme o valor base64 retornado em uma data URL PNG. O modelo aposentado e o campo antigo .url andam juntos, então ambas as metades precisam da atualização. Alterar uma sem a outra resulta em uma imagem quebrada, que é exatamente o erro que cometi primeiro!
JunoConserte o projeto de geração de imagens O contrato mudou em ambas as extremidades: o modelo que você requisita e o campo em que a imagem retorna. Peça por gpt-image-2 e leia b64_json em vez de .url, mantendo a atribuição ao redor de seu extrato. Se a imagem quebrar, verifique o prefixo data:image/png;base64, antes de mexer em qualquer outra coisa.
JunoConserte o projeto de geração de imagens Base64 significa que a imagem inteira viaja dentro da resposta JSON, então prepare-se para payloads de um megabyte ou mais e uma data URL que supera o resto do seu markup. Uma versão backend persistiria a imagem no servidor e entregaria à página uma URL curta em vez disso. Embutir está bem para um exercício local; em produção é um custo que você sente.

Conserte o projeto de visão

No projeto Vision Part 2, substitua o ID de modelo aposentado:

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

pelo gpt-4o-mini capaz de imagens:

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

O formato de mensagem existente ainda pode enviar entradas de texto e imagem.

Se a requisição atualizada falhar, envie uma mensagem apenas com texto para gpt-4o-mini primeiro. Um sucesso ali confirma que sua conta pode usar o modelo, o que deixa a parte de imagem da mensagem como o que inspecionar.

JunoConserte o projeto de visão Substitua o modelo de visão aposentado por gpt-4o-mini e deixe o formato de mensagem com texto e imagem sozinho. Apenas o ID do modelo mudou, não a forma da requisição. Quanto menos linhas você toca, menos pode quebrar, uma lição que continuo reaprendendo!
JunoConserte o projeto de visão Este conserto é apenas uma substituição de modelo; a reformulação da forma de resposta pertence à geração de imagens, não aqui. Aponte a requisição para gpt-4o-mini e mantenha o array de conteúdo multimodal intocado. Se a chamada ainda falhar após a troca, suspeite do acesso da conta antes de seu próprio código de mensagem.
JunoConserte o projeto de visão Altere apenas o ID de modelo aposentado e preserve o array de conteúdo multimodal. Se a chamada falhar, envie uma requisição apenas com texto para gpt-4o-mini primeiro: sucesso ali prova acesso à conta e localiza a falha no tratamento de imagem. Divida a requisição antes de reescrevê-la; falo como alguém que reescreveu primeiro.

Rode um dos projetos

bash
$ npm start

Abra a URL Local impressa pelo Vite. No projeto de geração de imagens, envie um prompt e procure pela imagem gerada na página. No projeto de visão, envie uma imagem e pergunta e procure pela resposta em texto do modelo. Reinicie após alterar .env, e pare o projeto com Ctrl+C.

JunoRode um dos projetos Execute npm start, abra a URL Local que Vite imprime, e tente o fluxo de ponta a ponta. Uma imagem gerada ou uma resposta de visão é o sinal de sucesso, e cada tentativa é uma requisição paga. Escrevo meu prompt de teste antes de começar a clicar, o que economiza dinheiro e segundas opiniões!
JunoRode um dos projetos Vite iniciando prova que o bundle adaptado compila; não diz nada sobre a conta. Uma requisição ao vivo verifica a chave, cobrança, acesso ao modelo e o caminho de resposta específico do projeto em um único disparo. Reinicie Vite após qualquer edição de .env, ou o valor antigo continua sendo servido.
JunoRode um dos projetos Cada projeto tem seu próprio sinal de sucesso: geração de imagens deve receber base64 e renderizá-lo como uma data URL, visão deve ter sua mensagem mista com texto e imagem aceita. Verifique contra o correto antes de mexer em código. Cada nova tentativa é cobrada, então leia o console primeiro e faça a segunda tentativa uma informada.

Solução de problemas

process is not defined: Substitua a leitura de chave process.env restante em index.js pela forma import.meta.env.VITE_....

A imagem gerada está quebrada: Confirme que o código lê b64_json e adiciona o prefixo data:image/png;base64, em vez de ler .url.

O modelo está indisponível: Confirme cobrança, verificação de organização e acesso ao modelo no projeto OpenAI. A disponibilidade do provider pode variar por conta.

O SDK relata um erro de ambiente semelhante ao navegador: npm install openai@latest mantém a proteção do navegador do SDK, que se recusa a rodar com uma chave de API no código do navegador. Se seu extrato ainda não passa dangerouslyAllowBrowser: true nas opções do cliente OpenAI, adicione ao lado da linha apiKey. O nome da opção é o aviso: isso permanece aceitável apenas para uma chave temporária e restrita usada localmente.

A requisição funciona mas a página fica inalterada: Verifique o console do navegador para um erro de renderização e compare o campo retornado com o conserto relevante acima.

JunoSolução de problemas Trabalhe descendo a lista: corrija qualquer leitura de process.env restante, confirme o modelo, depois verifique b64_json para geração de imagens ou o Console do navegador para um erro de renderização. A maioria das falhas aqui é uma edição inacabada em vez de um mistério. Verifique as coisas ordinárias primeiro; levou muito tempo para eu fazer disso um hábito!
JunoSolução de problemas Separe a substituição Vite, acesso à conta, forma de resposta e renderização de página; cada camada falha por conta própria. Uma requisição bem-sucedida ainda pode renderizar errado, então a aba Network e a página podem discordar. Combine o sintoma com uma camada antes de editar qualquer coisa.
JunoSolução de problemas Inspecione a resposta raw do provider antes de alterar código de UI; o payload encerra argumentos que a página não pode. Mantenha a saída de geração de imagens e o tratamento de mensagens de visão separados, porque suas falhas apenas parecem similares. E se o SDK atualizado se recusar a rodar no navegador, aquela proteção está fazendo seu trabalho; dangerouslyAllowBrowser é a substituição local apenas, não uma resposta de produção.