const getApiKey = (): string => {
const key = import.meta.env.VITE_ANTHROPIC_API_KEY;
if (!key) {
console.error('❌ VITE_ANTHROPIC_API_KEY não encontrada');
console.log('📋 Variáveis disponíveis:', Object.keys(import.meta.env));
throw new Error('Configure VITE_ANTHROPIC_API_KEY no arquivo .env');
}
console.log('✅ Chave API carregada:', key.substring(0, 20) + '...');
return key;
};// Idade obrigatória e válida
if (!profile.age || profile.age < 10 || profile.age > 120) {
throw new Error('Idade inválida ou não informada');
}
// Peso obrigatório e válido
if (!profile.weight_kg || profile.weight_kg < 30 || profile.weight_kg > 300) {
throw new Error('Peso inválido ou não informado');
}
// Altura obrigatória e válida
if (!profile.height_cm || profile.height_cm < 100 || profile.height_cm > 250) {
throw new Error('Altura inválida ou não informada');
}
// Objetivo obrigatório
if (!profile.goal) {
throw new Error('Objetivo nutricional não definido. Edite o cliente e selecione um objetivo.');
}
// Atividade obrigatória
if (!profile.activity_level) {
throw new Error('Nível de atividade física não definido. Edite o cliente e selecione o nível de atividade.');
}console.log('🚀 Iniciando geração de plano com IA');
console.log('👤 Perfil:', profile);
console.log('📊 Cálculos científicos:', calculatedData);
console.log('🤖 Chamando Claude API...');
console.log('✅ Resposta recebida da Claude API');
console.log('📝 Resposta (primeiros 300 chars):', responseText.substring(0, 300));
console.log('✅ JSON parseado com sucesso');
console.log('📋 Refeições sugeridas:', aiResponse.meals?.length || 0);if (error.message?.includes('API key')) {
throw new Error('Chave da API Anthropic inválida ou não configurada. Verifique VITE_ANTHROPIC_API_KEY no .env');
}
if (error.message?.includes('fetch')) {
throw new Error('Erro de rede ao conectar com Claude API. Verifique sua conexão.');
}
if (error.message?.includes('timeout')) {
throw new Error('Timeout ao conectar com Claude API. Tente novamente.');
}
if (error.message?.includes('rate limit')) {
throw new Error('Limite de requisições atingido. Aguarde alguns minutos e tente novamente.');
}Pressionar F12 (ou Ctrl+Shift+I)
→ Ir para aba "Console"
1. Ir em Planos Alimentares → Novo Plano
2. Selecionar Cliente
3. Clicar "Gerar Sugestão de Plano"
4. Observar logs no console
🚀 Iniciando geração de plano com IA
👤 Perfil: {
id: "...",
name: "Jeferson de lima",
age: 35,
gender: "male",
height_cm: 175,
weight_kg: 85,
activity_level: "sedentary",
goal: "weight_loss"
}
✅ Chave API carregada: sk-ant-api03-xxxxxx...
📊 Cálculos científicos: {
bmr: 1868,
tdee: 2241,
targetCalories: 1741,
macros: {
protein_g: 153,
carb_g: 195,
fat_g: 58
}
}
🤖 Chamando Claude API...
✅ Resposta recebida da Claude API
📝 Resposta (primeiros 300 chars): {"meals": [{"name": "Café da Manhã", "time": "08:00", "targetCalories": 348, "items": [{"food_name": "Pão integral", "quantity": 2, "measure": "fatias", "estimated_kcal": 130, "estimated_protein": 8, "estimated_carb": 24, "estimated_fat": 2}, ...
✅ JSON parseado com sucesso
📋 Refeições sugeridas: 5
🎯 Iniciando geração para: Jeferson de lima
✅ Plano gerado com sucesso
Causa: Arquivo .env não existe ou chave não está configurada
Solução:
# 1. Criar arquivo .env na raiz do projeto
touch .env
# 2. Adicionar chave (substituir XXXX pela chave real)
echo "VITE_ANTHROPIC_API_KEY=sk-ant-api03-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" >> .env
# 3. REINICIAR servidor (OBRIGATÓRIO)
# Ctrl+C para parar
npm run devVerificar:
// No console do navegador
console.log(import.meta.env.VITE_ANTHROPIC_API_KEY);
// Deve mostrar: sk-ant-api03-...Causa: Cliente não tem campo age preenchido
Solução:
1. Ir em Clientes
2. Editar cliente
3. Preencher campo "Idade" (ex: 35)
4. Salvar
5. Tentar gerar novamente
Ou via SQL:
UPDATE clients
SET age = 35
WHERE name = 'Jeferson de lima';Causa: Cliente não tem campo goal preenchido ou está com texto livre
Solução:
1. Ir em Clientes
2. Editar cliente
3. Selecionar dropdown "Objetivo Nutricional"
4. Escolher: Perda de Peso (ou outro)
5. Salvar
Ou via SQL:
UPDATE clients
SET goal = 'weight_loss'
WHERE name = 'Jeferson de lima';Valores válidos para goal:
maintenanceweight_lossmuscle_gainhealth
Causa: Cliente não tem campo activity_level preenchido
Solução:
1. Ir em Clientes
2. Editar cliente
3. Selecionar dropdown "Nível de Atividade Física"
4. Escolher: Sedentário (ou outro)
5. Salvar
Ou via SQL:
UPDATE clients
SET activity_level = 'sedentary'
WHERE name = 'Jeferson de lima';Valores válidos para activity_level:
sedentarylightmoderateintensevery_intense
Causa: Sem conexão com internet ou firewall bloqueando
Solução:
1. Verificar conexão com internet
2. Tentar acessar: https://api.anthropic.com
3. Desabilitar VPN/Proxy temporariamente
4. Verificar firewall não está bloqueando
Causa: Chave no .env está incorreta ou expirada
Solução:
1. Verificar chave começa com: sk-ant-api03-
2. Verificar não tem espaços antes/depois
3. Verificar chave está ativa no dashboard Anthropic
4. Gerar nova chave se necessário
5. REINICIAR servidor após modificar .env
Formato correto do .env:
VITE_ANTHROPIC_API_KEY=sk-ant-api03-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXNÃO usar:
# ❌ Errado - com aspas
VITE_ANTHROPIC_API_KEY="sk-ant-api03-..."
# ❌ Errado - com espaços
VITE_ANTHROPIC_API_KEY = sk-ant-api03-...
# ❌ Errado - múltiplas linhas
VITE_ANTHROPIC_API_KEY=sk-ant-api03-
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXCausa: Muitas requisições em pouco tempo
Solução:
1. Aguardar 5-10 minutos
2. Tentar novamente
3. Se persistir, verificar plano da API Anthropic
Causa: Resposta da API não está no formato JSON esperado
Solução:
1. Verificar logs completos no console
2. Copiar mensagem "Resposta completa:"
3. Pode ser problema temporário da API
4. Tentar novamente
Execute este SQL para verificar se cliente tem todos os dados:
SELECT
name,
age,
gender,
height_cm,
weight_kg,
activity_level,
goal
FROM clients
WHERE name ILIKE '%Jeferson%';Resultado esperado:
name: Jeferson de lima
age: 35
gender: male
height_cm: 175.00
weight_kg: 85.00
activity_level: sedentary
goal: weight_loss
Se algum campo estiver NULL:
UPDATE clients
SET
age = 35,
gender = 'male',
height_cm = 175,
weight_kg = 85,
activity_level = 'sedentary',
goal = 'weight_loss'
WHERE name ILIKE '%Jeferson%';No console do navegador:
// Verificar se chave existe
console.log('Chave existe:', !!import.meta.env.VITE_ANTHROPIC_API_KEY);
// Ver primeiros 20 caracteres
console.log('Chave:', import.meta.env.VITE_ANTHROPIC_API_KEY?.substring(0, 20));
// Listar todas variáveis disponíveis
console.log('Env vars:', Object.keys(import.meta.env));Saída esperada:
Chave existe: true
Chave: sk-ant-api03-xxxxxx
Env vars: ["VITE_SUPABASE_URL", "VITE_SUPABASE_ANON_KEY", "VITE_ANTHROPIC_API_KEY", ...]
SEMPRE que modificar arquivo .env, você DEVE reiniciar o servidor:
# Parar servidor
Ctrl + C
# Iniciar novamente
npm run devVariáveis de ambiente só são carregadas na inicialização do servidor. Modificações não são detectadas automaticamente.
- Verificar migrations foram executadas:
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'clients'
AND column_name IN ('age', 'gender', 'height_cm', 'weight_kg', 'activity_level', 'goal');- Verificar cliente tem dados completos:
SELECT * FROM clients WHERE name ILIKE '%Jeferson%';- Verificar arquivo .env existe:
cat .env | grep ANTHROPIC- Limpar cache do navegador:
Ctrl + Shift + Delete → Limpar cache → Recarregar página
- Reinstalar dependências:
rm -rf node_modules
npm install
npm run devSe precisar de ajuda, forneça:
- Logs completos do console (F12)
- Mensagem de erro exata
- Resultado da query de verificação do cliente
- Confirmação de que .env existe e servidor foi reiniciado
- Arquivo
.envexiste na raiz do projeto -
VITE_ANTHROPIC_API_KEYestá no.env(sem aspas, sem espaços) - Chave começa com
sk-ant-api03- - Servidor foi reiniciado após modificar
.env - Cliente tem
age,gender,height_cm,weight_kgpreenchidos - Cliente tem
goalselecionado (dropdown, não texto livre) - Cliente tem
activity_levelselecionado - Migrations foram executadas no Supabase
- Console do navegador aberto (F12)
- Conexão com internet funcionando
Se todos os itens estiverem marcados e ainda houver erro, copie os logs do console e a mensagem de erro exata.