Spaces:
Sleeping
Sleeping
import os | |
import pandas as pd | |
import openai | |
from google.oauth2 import service_account | |
from googleapiclient.discovery import build | |
from googleapiclient.http import MediaIoBaseDownload | |
import io | |
import json | |
# Função para carregar e testar a leitura do arquivo CSV | |
def load_and_test_csv(): | |
try: | |
# Carrega as credenciais a partir da variável de ambiente do Hugging Face Secrets | |
cred_json = os.getenv("GOOGLE_APPLICATION_CREDENTIALS") | |
# Utiliza google.oauth2.service_account para carregar as credenciais corretamente | |
creds = service_account.Credentials.from_service_account_info(json.loads(cred_json)) | |
# Autentica com o Google API | |
service = build('drive', 'v3', credentials=creds) | |
# ID do arquivo no Google Drive (substituído pelo ID real fornecido) | |
file_id = '1lNadnIVnDs9Oex5ckNXj1-56nvlEea6p' | |
# Solicita o download do arquivo CSV | |
request = service.files().get_media(fileId=file_id) | |
fh = io.FileIO('imoveis_ficticios.csv', 'wb') | |
downloader = MediaIoBaseDownload(fh, request) | |
done = False | |
while done is False: | |
status, done = downloader.next_chunk() | |
# Carrega o CSV usando pandas | |
df = pd.read_csv('imoveis_ficticios.csv') | |
# Verifica se as colunas necessárias estão presentes | |
required_columns = ['nome', 'bairro', 'valor', 'aluguel', 'rentabilidade', 'status'] | |
missing_columns = [col for col in required_columns if col not in df.columns] | |
if missing_columns: | |
# Retorna um erro claro sem tentar abrir esse erro como arquivo | |
return f"Erro: Colunas ausentes no CSV: {', '.join(missing_columns)}" | |
return df | |
except Exception as e: | |
return f"Erro ao acessar o arquivo CSV: {e}" | |
# Função para buscar imóveis na planilha | |
def buscar_imoveis(bairro=None, status=None, preco_maximo=2000000): | |
try: | |
# Carrega os dados da planilha | |
df = load_and_test_csv() | |
if isinstance(df, str): | |
return df # Se houve erro na leitura, retorna o erro | |
# Verifica se a coluna 'valor' existe antes de fazer qualquer operação | |
if 'valor' not in df.columns: | |
return "Erro: A coluna 'valor' não foi encontrada no arquivo CSV." | |
# Converte a coluna 'valor' para numérico, caso seja necessário | |
df['valor'] = pd.to_numeric(df['valor'], errors='coerce') | |
# Filtra os imóveis com base nos critérios fornecidos | |
if bairro: | |
df = df[df['bairro'].str.contains(bairro, case=False, na=False)] | |
if status: | |
df = df[df['status'].isin(status)] # Filtra com base nos status selecionados | |
# Filtra pelo preço máximo | |
df = df[df['valor'] <= preco_maximo] # Filtra pelo preço máximo | |
# Exibe os resultados | |
if df.empty: | |
return "Nenhum imóvel encontrado com os critérios informados." | |
else: | |
return df[['nome', 'bairro', 'valor', 'aluguel', 'rentabilidade', 'status']].head(5) # Exibe os primeiros 5 resultados | |
except Exception as e: | |
return f"Erro na busca: {e}" | |
# Função para interagir com o modelo GPT | |
def conversacao_openai(prompt): | |
openai.api_key = os.getenv("OPENAI_API_KEY") | |
try: | |
response = openai.Completion.create( | |
model="text-davinci-003", # Ou o modelo GPT adequado | |
prompt=prompt, | |
max_tokens=150 | |
) | |
return response.choices[0].text.strip() | |
except Exception as e: | |
return f"Erro ao interagir com o OpenAI: {e}" | |
# Função principal de interação | |
def interagir_com_usuario(): | |
print("Olá! Eu sou seu assistente para ajudar na busca de imóveis. Como posso te ajudar hoje?") | |
while True: | |
user_input = input("Você: ") | |
# Se o usuário quiser parar a conversa | |
if user_input.lower() in ['sair', 'tchau', 'adeus']: | |
print("Até logo!") | |
break | |
# Definir parâmetros para a busca com base na entrada do usuário | |
bairro = None | |
status = None | |
preco_maximo = 2000000 # Preço padrão, pode ser alterado pela interação | |
# Aqui, podemos usar o OpenAI para interpretar as intenções do usuário. | |
prompt = f"Usuário quer buscar imóveis com as seguintes palavras: {user_input}. Interpretar isso como bairros, status e preços de imóveis." | |
gpt_response = conversacao_openai(prompt) | |
print(f"Assistente: {gpt_response}") | |
# Parse do GPT para obter os parâmetros de busca (simplificado) | |
if "bairro" in gpt_response: | |
bairro = gpt_response.split("bairro:")[1].strip().split()[0] # Apenas para ilustrar, ajustar conforme necessário | |
if "status" in gpt_response: | |
status = gpt_response.split("status:")[1].strip().split()[0] # Ajuste conforme resposta do GPT | |
if "preço" in gpt_response: | |
preco_maximo = int(gpt_response.split("preço:")[1].strip().split()[0]) # Ajuste conforme resposta do GPT | |
# Realizar a busca com base na interpretação do GPT | |
resultado = buscar_imoveis(bairro=bairro, status=status, preco_maximo=preco_maximo) | |
print(f"Assistente: {resultado}") | |
if __name__ == "__main__": | |
interagir_com_usuario() | |