Spaces:
Build error
Build error
File size: 5,044 Bytes
37db009 0f8752b 37db009 2f5b2ad a90e884 37db009 a90e884 37db009 a90e884 5a6e729 37db009 c719849 0f8752b c719849 4d4dffe 0f8752b 4d4dffe 0f8752b a90e884 37db009 2f5b2ad 4c86230 37db009 2f5b2ad 37db009 8f5ecb1 2f5b2ad 37db009 8f5ecb1 37db009 0f8752b a90e884 37db009 a90e884 37db009 0f8752b c719849 0f8752b c719849 5a6e729 37db009 2f5b2ad 5a6e729 2f5b2ad 5a6e729 2f5b2ad 5a6e729 2f5b2ad 5a6e729 2f5b2ad 5a6e729 a90e884 5a6e729 37db009 5a6e729 37db009 a90e884 37db009 0f8752b 2f5b2ad | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | from fastapi import FastAPI, HTTPException
from fastapi.responses import HTMLResponse
from supabase import create_client, Client
from supabase.lib.client_options import ClientOptions
from groq import Groq
import os
app = FastAPI()
# --- CONFIGURAÇÕES ---
SUPABASE_URL = "https://mgjzcnaijbeyrkojudlz.supabase.co"
SUPABASE_KEY = os.environ.get("SUPABASE_KEY")
GROQ_API_KEY = os.environ.get("GROQ_API_KEY")
MODELO_LLM = "meta-llama/llama-4-scout-17b-16e-instruct"
if not SUPABASE_KEY or not GROQ_API_KEY:
print("AVISO: Chaves de API não encontradas nas variáveis de ambiente.")
opts = ClientOptions(schema="mkt_auto")
supabase: Client = create_client(
SUPABASE_URL,
SUPABASE_KEY,
options=opts
)
groq_client = Groq(api_key=GROQ_API_KEY)
@app.get("/", response_class=HTMLResponse)
def home():
return """<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Recomend_AI | MKT Auto</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-slate-900 text-white min-h-screen flex items-center justify-center p-6">
<div class="max-w-md w-full bg-slate-800 p-8 rounded-2xl shadow-2xl border border-slate-700">
<h1 class="text-2xl font-bold mb-6 text-center text-blue-400">🛒 Recomend_AI</h1>
<div class="space-y-4">
<label>ID do Cliente (CPF)</label>
<input id="cpf" class="w-full p-3 bg-slate-700 rounded"/>
<button onclick="buscarRecomendacoes()" class="w-full bg-blue-600 py-3 rounded">Gerar Recomendações</button>
</div>
<div id="resultado" class="mt-6 hidden">
<ul id="lista"></ul>
</div>
<script>
async function buscarRecomendacoes(){
const cpf = document.getElementById("cpf").value;
const res = await fetch(`/recomendacoes/${cpf}`);
const data = await res.json();
const lista = document.getElementById("lista");
lista.innerHTML="";
if(data.recomendacoes_ia){
data.recomendacoes_ia.forEach(i=>{
const li=document.createElement("li");
li.innerText=i;
lista.appendChild(li);
});
}
document.getElementById("resultado").classList.remove("hidden");
}
</script>
</div>
</body>
</html>"""
@app.get("/recomendacoes/{id_cliente}")
async def get_recomendacoes(id_cliente: str):
try:
response = (
supabase.table("pedido")
.select("id, itempedido(id_produto, produto(nome))")
.eq("id_cliente", id_cliente)
.execute()
)
if not response.data:
return {"msg": "Sem histórico para este cliente."}
produtos_comprados = []
for pedido in response.data:
itens = pedido.get('itempedido', [])
if isinstance(itens, list):
for item in itens:
if item.get('produto'):
produtos_comprados.append(item['produto']['nome'])
if not produtos_comprados:
return {"msg": "O cliente tem pedidos, mas os itens não foram encontrados."}
historico_unico = list(set(produtos_comprados))[:5]
lista_compras = ", ".join(historico_unico)
produtos_response = supabase.table("produto").select("nome").execute()
all_products = [p['nome'] for p in produtos_response.data]
lista_all = ", ".join(all_products)
promos_response = (
supabase.table("historico_preco")
.select("id_produto_mercado, preco_antigo, preco_novo, produto_mercado(produto(nome))")
.lt("preco_novo", "preco_antigo")
.order("id", desc=True)
.limit(20)
.execute()
)
produtos_promo = []
for hist in promos_response.data:
produto_mercado = hist.get('produto_mercado')
if produto_mercado and produto_mercado.get('produto'):
nome = produto_mercado['produto']['nome']
if nome not in produtos_promo:
produtos_promo.append(nome)
lista_promo = ", ".join(produtos_promo) if produtos_promo else "Nenhuma promoção encontrada."
prompt = f"""
O cliente comprou: {lista_compras}.
Lista de todos os produtos disponíveis: {lista_all}.
Produtos em promoção (preço reduzido recentemente): {lista_promo}.
Sugira exatamente 5 produtos NOVOS (não comprados pelo cliente) da lista de disponíveis.
Foque em produtos relacionados aos comprados.
Responda APENAS com os 5 nomes separados por vírgula.
"""
completion = groq_client.chat.completions.create(
model=MODELO_LLM,
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
)
sugestoes_ia = completion.choices[0].message.content.strip().split(",")
sugestoes_ia = [s.strip() for s in sugestoes_ia if s.strip()]
return {
"id_cliente": id_cliente,
"historico": historico_unico,
"recomendacoes_ia": sugestoes_ia
}
except Exception as e:
print(f"Erro: {e}")
raise HTTPException(status_code=500, detail=str(e))
|