Recomend_AI / app.py
XablauMoon's picture
Update app.py
2f5b2ad verified
Raw History Blame Contribute Delete
5.04 kB
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))