Spaces:
Sleeping
Sleeping
| # 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() | |
| 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() |