conversacional_invest / apptop10.py
Persano's picture
Rename app.py to apptop10.py
e7644e8 verified
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()