Spaces:
Build error
Build error
Download app.py from XablauMoon/Recomend_AI: direct link, hf CLI and curl.
- Browser
- Download file 5.04 kB
-
https://huggingface.co/spaces/XablauMoon/Recomend_AI/resolve/main/app.py
- Command line
-
hf download hf://spaces/XablauMoon/Recomend_AI/app.py
-
curl -L -o app.py https://huggingface.co/spaces/XablauMoon/Recomend_AI/resolve/main/app.py
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) | |
| 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>""" | |
| 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)) | |