- Conceitos básicos do LangGraph
- Nós (Nodes) → Funções/agentes especializados.
- Arestas (Edges) → Conexões entre nós.
- Arestas Condicionais → Controlam fluxo dinâmico.
- Busca agêntica → Agente pesquisa, analisa e decide.
- Multiagentes
Divisão de responsabilidades:
- Planejar
- Pesquisar
- Escrever
- Criticar
- Refinar
Isso melhora:
- Modularidade
- Escalabilidade
- Qualidade do conteúdo
from langgraph.graph import StateGraph
- Uso do Selenium para web scraping
Selenium é usado quando páginas exigem JS dinâmico.
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com")
text = driver.find_element(By.TAG_NAME, "body").text
driver.quit()
- Persistência e streaming no fluxo de agentes
Persistência: salvar estado entre execuções.
graph.compile(checkpointer=memory)
for chunk in app.stream(inputs):
print(chunk)
- Lógica de Human‑in‑the‑Loop
Humano intervém quando:
- confiança < limiar
- crítica aponta falhas graves
- domínio sensível
if state["critic"]["confidence"] < 0.7:
return "human_review"
- Classe Agent State
Estado central compartilhado entre nós.
from typing import TypedDict
class AgentState(TypedDict):
task: str
plan: str
draft: str
critic: str
content: str
- Prompts dos 5 agentes
| Agente | Função principal |
|---|---|
| Planejador | Quebrar tarefa em plano |
| Escritor | Gerar texto |
| Pensador | Raciocínio técnico |
| Pesquisador | Buscar fatos |
| Crítico | Avaliar e corrigir |
| ---------------- | ------------------------------------ |
PLANNER_PROMPT = "Crie um plano de redação estruturado."
WRITER_PROMPT = "Escreva o texto conforme o plano."
CRITIC_PROMPT = "Avalie clareza, precisão e coerência."
- Nó de planejamento
Converte tarefa → plano.
def plan_node(state: AgentState):
state["plan"] = llm.invoke(f"Plano para: {state['task']}")
return state
- Nó de pesquisa com Tavily
from tavily import TavilyClient
tavily = TavilyClient()
def research_node(state):
query = f"Informações atualizadas sobre {state['task']}"
state["content"] = tavily.search(query)
return state
- Nó de geração (5 parágrafos)
def generate_node(state):
prompt = f"""
Use o plano:
{state['plan']}
Gere 5 parágrafos.
"""
state["draft"] = llm.invoke(prompt)
return state
- Nó de reflexão (crítica técnica)
def critic_node(state):
state["critic"] = llm.invoke(
f"Avalie tecnicamente:\n{state['draft']}"
)
return state
- Pesquisa de crítica (atualização web)
Valida críticas com dados externos.
def critic_research_node(state):
findings = tavily.search("verificação factual do conteúdo")
state["draft"] += f"\n\nAtualizações:\n{findings}"
return state
- Aresta condicional (continuar ou encerrar)
def should_continue(state):
return "end" if "aprovado" in state["critic"] else "revise"
``
- Integração no LangGraph
graph = StateGraph(AgentState)
graph.add_node("plan", plan_node)
graph.add_node("research", research_node)
graph.add_node("generate", generate_node)
graph.add_node("critic", critic_node)
graph.add_edge("plan", "research")
graph.add_edge("research", "generate")
graph.add_edge("generate", "critic")
graph.add_conditional_edges("critic", should_continue)
app = graph.compile()
- Interface gráfica com Gradle (conceito)
Gradle não é UI, mas pode empacotar:
Backend Python (API)
Frontend (JavaFX / WebView)
Fluxo típico:
Gradle → build
UI → chama API LangGraph
Exibe streaming do agente
gradle build
gradle run
Teste o fluxo disparando uma tarefa e acompanhando:
plano
rascunho
crítica
versão final
AgenteFunção principalPlanejadorQuebrar tarefa em planoEscritorGerar textoPensadorRaciocínio técnicoPesquisadorBuscar fatosCríticoAvaliar e corrigir
PythonPLANNER_PROMPT = "Crie um plano de redação estruturado."WRITER_PROMPT = "Escreva o texto conforme o plano."CRITIC_PROMPT = "Avalie clareza, precisão e coerência."Mostrar mais linhas
- Nó de planejamento