Spaces:
Sleeping
Sleeping
import gradio as gr | |
import pandas as pd | |
import os | |
import json | |
from google.oauth2 import service_account | |
from googleapiclient.discovery import build | |
from googleapiclient.http import MediaIoBaseDownload | |
import io | |
import openai | |
openai.api_key = os.getenv("OPENAI_API_KEY") | |
# Load CSV from Google Drive | |
def load_data(): | |
try: | |
cred_json = os.getenv("GOOGLE_APPLICATION_CREDENTIALS") | |
creds = service_account.Credentials.from_service_account_info(json.loads(cred_json)) | |
service = build('drive', 'v3', credentials=creds) | |
file_id = '1lNadnIVnDs9Oex5ckNXj1-56nvlEea6p' | |
request = service.files().get_media(fileId=file_id) | |
fh = io.FileIO('imoveis.csv', 'wb') | |
downloader = MediaIoBaseDownload(fh, request) | |
done = False | |
while not done: | |
_, done = downloader.next_chunk() | |
df = pd.read_csv('imoveis.csv') | |
return df | |
except Exception as e: | |
return f"Erro ao carregar planilha: {e}" | |
# Detecta elementos na frase | |
def extrair_info(mensagem): | |
bairros = ['Bela Vista', 'Moema', 'Pinheiros', 'Centro', 'Vila Mariana'] | |
status_list = ['pronto', 'em construção', 'na planta'] | |
bairro = next((b for b in bairros if b.lower() in mensagem.lower()), None) | |
status = next((s for s in status_list if s in mensagem.lower()), None) | |
preco = None | |
for word in mensagem.split(): | |
if word.replace("R$", "").replace(".", "").replace(",", "").isdigit(): | |
preco = int(word.replace("R$", "").replace(".", "").replace(",", "")) | |
break | |
return {"bairro": bairro, "status": status, "preco": preco} | |
# Faz busca real na planilha | |
def buscar_imoveis(df, bairro, status, preco_maximo): | |
resultado = df.copy() | |
if bairro: | |
resultado = resultado[resultado['bairro'].str.contains(bairro, case=False, na=False)] | |
if status: | |
resultado = resultado[resultado['status'].str.lower() == status] | |
if preco_maximo: | |
resultado = resultado[resultado['valor'] <= preco_maximo] | |
return resultado.head(3) | |
# Memória da conversa | |
conversa_global = {"bairro": None, "status": None, "preco": None} | |
def conversar(mensagem_usuario): | |
global conversa_global | |
df = load_data() | |
if isinstance(df, str): | |
return df # erro | |
# Atualiza contexto com nova informação | |
info = extrair_info(mensagem_usuario) | |
for chave in ["bairro", "status", "preco"]: | |
if info[chave]: | |
conversa_global[chave] = info[chave] | |
# Verifica o que falta | |
faltando = [] | |
if not conversa_global["bairro"]: | |
faltando.append("Qual bairro você procura?") | |
if not conversa_global["preco"]: | |
faltando.append("Qual o valor máximo que pretende investir?") | |
if not conversa_global["status"]: | |
faltando.append("Você procura um imóvel pronto, em construção ou na planta?") | |
# Se faltar algo, perguntar | |
if faltando: | |
return "\n".join(faltando) | |
# Se já tem tudo, buscar imóveis | |
encontrados = buscar_imoveis( | |
df, | |
conversa_global["bairro"], | |
conversa_global["status"], | |
conversa_global["preco"] | |
) | |
if encontrados.empty: | |
return "Não encontrei imóveis com essas características. Deseja ajustar algum critério?" | |
resposta = "Encontrei algumas opções para você:\n" | |
for _, row in encontrados.iterrows(): | |
resposta += ( | |
f"{row['nome']} em {row['bairro']} - R${row['valor']}, " | |
f"aluguel de R${row['aluguel']}, rentabilidade de {row['rentabilidade']}%, status: {row['status']}\n" | |
) | |
resposta += "\nQuer saber mais sobre algum deles ou ajustar seus critérios?" | |
conversa_global = {"bairro": None, "status": None, "preco": None} # reset | |
return resposta | |
# Gradio interface | |
gr.Interface( | |
fn=conversar, | |
inputs=gr.Textbox(label="Sua mensagem", placeholder="Ex: Procuro imóvel na Bela Vista até R$500.000"), | |
outputs="text", | |
title="Agente Imobiliário IA", | |
description="Converse livremente e receba sugestões de imóveis com base na sua necessidade." | |
).launch() | |