flash-research / app.py
spadini's picture
Update app.py
f250105 verified
# main.py
import os
import gradio as gr
from functools import partial
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain.agents import load_tools
from langgraph.graph import StateGraph, START, END
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.tools import tool
# Importa as funções e a classe de estado do outro arquivo
from agente_functions import (
AgentState,
busca_web,
funcao_agente_web,
funcao_agente_cientifico,
supervisor_node,
router_agent
)
# --- 1. Configuração do Ambiente ---
# É recomendado carregar as chaves de um arquivo .env para segurança
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("GOOGLE_API_KEY")
tavily_api_key = os.getenv("TAVILY_API_KEY")
# Para este exemplo, vamos supor que as chaves estão como variáveis de ambiente
os.environ["GOOGLE_API_KEY"] = api_key
os.environ["TAVILY_API_KEY"] = tavily_api_key
if not os.environ.get("GOOGLE_API_KEY") or not os.environ.get("TAVILY_API_KEY"):
print("Por favor, defina as variáveis de ambiente GOOGLE_API_KEY e TAVILY_API_KEY.")
exit()
@tool
def busca_web(query: str) -> list:
"""
Busca na web por um termo específico
"""
tavily_search = TavilySearchResults(max_results=2, search_depth='advanced', max_tokens=1000)
resultado_busca = tavily_search.invoke(query)
return resultado_busca
# --- 2. Inicialização do Modelo e Ferramentas ---
llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash")
web_tools = [busca_web]
scientific_tools = load_tools(["arxiv"])
# --- 3. Construção do Grafo com LangGraph ---
workflow = StateGraph(AgentState)
# Usando functools.partial para passar argumentos fixos (llm, tools) para as funções dos nós
web_search_node = partial(funcao_agente_web, llm=llm, tools=web_tools)
scientific_search_node = partial(funcao_agente_cientifico, llm=llm, tools=scientific_tools)
router_node = partial(router_agent, llm=llm)
# Adiciona os nós ao grafo
workflow.add_node("router", router_node)
workflow.add_node("web_search", web_search_node)
workflow.add_node("scientific_search", scientific_search_node)
workflow.add_node("supervisor", supervisor_node)
# Define as arestas (fluxo de trabalho)
workflow.add_edge(START, "router")
workflow.add_conditional_edges(
"router",
lambda state: state['router_decision'],
{
"web_search": "web_search",
"scientific_search": "scientific_search"
}
)
workflow.add_edge("web_search", "supervisor")
workflow.add_edge("scientific_search", "supervisor")
workflow.add_edge("supervisor", END)
# Compila o grafo para torná-lo executável
app = workflow.compile()
# --- 4. Função para Interface do Gradio ---
def run_graph(user_query: str) -> str:
"""
Executa o grafo do LangGraph com a pergunta do usuário e retorna a resposta final.
"""
try:
result = app.invoke({"user_query": user_query})
# Retorna a resposta final do supervisor, com um fallback
return result.get("final_answer", "Não foi possível obter uma resposta final.")
except Exception as e:
return f"Ocorreu um erro: {e}"
# --- 5. Lançamento da Aplicação com Gradio ---
if __name__ == "__main__":
print("Iniciando a interface do Gradio...")
iface = gr.Interface(
fn=run_graph,
inputs=gr.Textbox(lines=2, label="Digite sua pergunta:", placeholder="Ex: Qual o impacto da IA na medicina?"),
outputs=gr.Markdown(label="Resposta do Agente"),
title="🤖 Agente de Pesquisa com LangGraph e Gemini",
description="Faça uma pergunta e obtenha uma resposta com fontes web ou fontes científicas.",
allow_flagging="never"
)
iface.launch()