File size: 3,721 Bytes
46c63b7
 
 
 
 
 
 
 
 
91bd8fa
 
46c63b7
 
 
 
 
 
 
 
 
 
 
 
 
0d7382f
 
 
 
46c63b7
 
0d7382f
 
46c63b7
 
 
 
 
91bd8fa
 
 
 
 
 
 
 
 
46c63b7
566fc9a
46c63b7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d405655
46c63b7
f250105
46c63b7
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# 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()