Spaces:
Sleeping
Sleeping
| """ | |
| Nó para refinamento de respostas | |
| """ | |
| import logging | |
| from typing import Dict, Any | |
| from agents.tools import refine_response_with_llm | |
| async def refine_response_node(state: Dict[str, Any]) -> Dict[str, Any]: | |
| """ | |
| Nó para refinar a resposta usando LLM adicional | |
| Args: | |
| state: Estado atual do agente | |
| Returns: | |
| Estado atualizado com resposta refinada | |
| """ | |
| if not state.get("advanced_mode", False) or state.get("error"): | |
| # Pula refinamento se modo avançado desabilitado ou há erro | |
| logging.info("[REFINE] Pulando refinamento - modo avançado desabilitado ou erro presente") | |
| return state | |
| logging.info("[REFINE] Iniciando refinamento da resposta") | |
| try: | |
| original_response = state.get("response", "") | |
| user_input = state.get("user_input", "") | |
| if not original_response or not user_input: | |
| logging.warning("[REFINE] Resposta ou entrada do usuário não disponível") | |
| return state | |
| # Refina resposta com LLM adicional | |
| refined_response = await refine_response_with_llm( | |
| user_input, | |
| original_response | |
| ) | |
| # Atualiza estado com resposta refinada | |
| state["response"] = refined_response | |
| state["refined"] = True | |
| logging.info("[REFINE] Resposta refinada com sucesso") | |
| except Exception as e: | |
| error_msg = f"Erro ao refinar resposta: {e}" | |
| logging.error(f"[REFINE] {error_msg}") | |
| # Mantém resposta original em caso de erro | |
| state["refinement_error"] = error_msg | |
| return state | |
| async def check_refinement_quality_node(state: Dict[str, Any]) -> Dict[str, Any]: | |
| """ | |
| Nó para verificar qualidade do refinamento | |
| Args: | |
| state: Estado com resposta refinada | |
| Returns: | |
| Estado com avaliação da qualidade | |
| """ | |
| try: | |
| original_response = state.get("sql_result", {}).get("output", "") | |
| refined_response = state.get("response", "") | |
| if not state.get("refined", False): | |
| state["refinement_quality"] = "not_refined" | |
| return state | |
| # Métricas simples de qualidade | |
| quality_metrics = { | |
| "length_increase": len(refined_response) - len(original_response), | |
| "has_insights": any(word in refined_response.lower() for word in [ | |
| "insight", "análise", "interpretação", "conclusão", "tendência" | |
| ]), | |
| "has_statistics": any(word in refined_response.lower() for word in [ | |
| "média", "total", "percentual", "proporção", "estatística" | |
| ]), | |
| "improved": len(refined_response) > len(original_response) * 1.1 | |
| } | |
| # Determina qualidade geral | |
| if quality_metrics["improved"] and (quality_metrics["has_insights"] or quality_metrics["has_statistics"]): | |
| quality_score = "high" | |
| elif quality_metrics["length_increase"] > 0: | |
| quality_score = "medium" | |
| else: | |
| quality_score = "low" | |
| state["refinement_quality"] = quality_score | |
| state["quality_metrics"] = quality_metrics | |
| logging.info(f"[REFINE] Qualidade avaliada: {quality_score}") | |
| except Exception as e: | |
| logging.error(f"[REFINE] Erro ao avaliar qualidade: {e}") | |
| state["refinement_quality"] = "error" | |
| return state | |
| async def format_final_response_node(state: Dict[str, Any]) -> Dict[str, Any]: | |
| """ | |
| Nó para formatação final da resposta | |
| Args: | |
| state: Estado com resposta processada | |
| Returns: | |
| Estado com resposta formatada | |
| """ | |
| try: | |
| response = state.get("response", "") | |
| execution_time = state.get("execution_time", 0.0) | |
| advanced_mode = state.get("advanced_mode", False) | |
| refined = state.get("refined", False) | |
| # Adiciona informações de contexto se necessário | |
| if advanced_mode and refined: | |
| quality = state.get("refinement_quality", "unknown") | |
| if quality == "high": | |
| response += "\n\n💡 *Resposta aprimorada com análise avançada*" | |
| elif quality == "medium": | |
| response += "\n\n🔍 *Resposta complementada*" | |
| # Adiciona tempo de execução se significativo | |
| if execution_time > 2.0: | |
| response += f"\n\n⏱️ *Processado em {execution_time:.1f}s*" | |
| # Formatação final | |
| state["response"] = response.strip() | |
| state["formatted"] = True | |
| logging.info(f"[FORMAT] Resposta formatada - {len(response)} caracteres") | |
| except Exception as e: | |
| logging.error(f"[FORMAT] Erro na formatação: {e}") | |
| # Mantém resposta original se houver erro na formatação | |
| return state | |