Spaces:
Sleeping
Sleeping
| import re | |
| import sys | |
| import logging | |
| import traceback | |
| from flask import Blueprint, render_template, request | |
| from services.genai_service import configure_genai | |
| from logs import get_user_history, save_log | |
| # Configurar logger | |
| logging.basicConfig(level=logging.ERROR) | |
| logger = logging.getLogger(__name__) | |
| chat_bp = Blueprint('chat', __name__) | |
| def chat(user_id): | |
| """ | |
| Rota para interação do usuário com a IA. | |
| """ | |
| history = get_user_history(user_id) | |
| if not history: | |
| return render_template('error_redirect.html') | |
| response = None | |
| if request.method == 'POST': | |
| question = request.form.get('question') | |
| try: | |
| model = configure_genai() | |
| session = model.start_chat(enable_automatic_function_calling=True) | |
| prompt = ( | |
| f"Você é uma especialista em livros e pode conversar " | |
| f"livremente sobre obras literárias, personagens, enredos, " | |
| f"gêneros e autores. O nome do usuário é " | |
| f"{history.get('name', f'Usuário {user_id}')}. " | |
| f"As preferências dele são: " | |
| f"{', '.join(history.get('preferences', [])) or 'nenhuma'}. " | |
| f"Histórico: {history}. " | |
| f"Pergunta: {question}. Responda na mesma língua da pergunta," | |
| f" com até 500 caracteres." | |
| f"Fale diretamente com o usuário." | |
| ) | |
| gemini_response = session.send_message(prompt) | |
| response = gemini_response.text | |
| save_log(user_id, history, response) | |
| except Exception as e: | |
| logger.error(f"Erro CRÍTICO ao usar a IA: {e}") | |
| logger.error(traceback.format_exc()) | |
| print(f"Erro ao usar a IA (stdout): {e}", flush=True) | |
| print(traceback.format_exc(), flush=True) | |
| response = "⚠️ A IA está indisponível, retorne em 24h." | |
| formatted_response = None | |
| if response: | |
| formatted_response = response.replace('\n', '<br>') | |
| formatted_response = re.sub( | |
| r'(?<=<br>)\s*(Ficção|Não[- ]Ficção|Ciência|Fantasia)\s*:(?=<br>)', | |
| r'<b>\1:</b>', | |
| f"<br>{formatted_response}<br>" | |
| )[4:-4] | |
| formatted_response = formatted_response.replace('**', '') | |
| formatted_response = formatted_response.replace('* ', '• ') | |
| return render_template( | |
| 'chat.html', | |
| user_id=user_id, | |
| response=formatted_response, | |
| history=history | |
| ) | |
| def list_models(): | |
| """ | |
| Rota de debug para listar modelos disponíveis na API. | |
| """ | |
| try: | |
| import google.generativeai as genai | |
| import os | |
| api_key = os.getenv("GOOGLE_API_KEY") | |
| if not api_key: | |
| return "<h1>Erro: API Key não encontrada</h1>" | |
| genai.configure(api_key=api_key) | |
| models_info = [] | |
| for m in genai.list_models(): | |
| if 'generateContent' in m.supported_generation_methods: | |
| models_info.append(f"<li><b>{m.name}</b> (Display Name: {m.display_name})</li>") | |
| if not models_info: | |
| return "<h1>Nenhum modelo encontrado com suporte a 'generateContent'</h1>" | |
| return f"<h1>Modelos Disponíveis:</h1><ul>{''.join(models_info)}</ul>" | |
| except Exception as e: | |
| return f"<h1>Erro ao listar modelos:</h1><pre>{e}</pre>" | |