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 """
Recomend_AI | MKT Auto
"""
@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))