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))