1
resposta

Etapa #1

from typing import TypedDict
from langgraph.graph import StateGraph, END

1. Estado compartilhado

class AgentState(TypedDict, total=False):
comentario_original: str
politicas_relevantes: str
analise_do_agente: str
status_da_moderacao: str
justificativa_final: str

2. Diretrizes simuladas

DIRETRIZES = {
"spam": "É proibido divulgar links, promoções enganosas ou repetir mensagens comerciais.",
"ofensivo": "É proibido insultar, humilhar ou atacar outros usuários.",
"inadequado": "Linguagem agressiva ou imprópria pode exigir edição antes da publicação."
}

3. Agente Analisador

def agente_analisador(state: AgentState):
texto = state["comentario_original"].lower()
if any(p in texto for p in ["http", "promoção", "grátis", "compre agora"]):
analise = "potencialmente problemático: spam"
elif any(p in texto for p in ["idiota", "burro", "lixo"]):
analise = "potencialmente problemático: ofensivo"
elif any(p in texto for p in ["ruim", "ok", "mais ou menos"]):
analise = "neutro"
else:
analise = "positivo"
return {"analise_do_agente": analise}

4. Rota condicional

def rota_analise(state: AgentState):
if "potencialmente problemático" in state["analise_do_agente"]:
return "pesquisador"
return "aprovar"

5. Agente Pesquisador de Políticas

def agente_pesquisador(state: AgentState):
analise = state["analise_do_agente"]
if "spam" in analise:
politica = DIRETRIZES["spam"]
elif "ofensivo" in analise:
politica = DIRETRIZES["ofensivo"]
else:
politica = DIRETRIZES["inadequado"]
return {"politicas_relevantes": politica}

6. Agente Revisor

def agente_revisor(state: AgentState):
analise = state["analise_do_agente"]
politica = state.get("politicas_relevantes", "")
if "spam" in analise:
return {
"status_da_moderacao": "Remover por Spam",
"justificativa_final": f"{analise}. Política aplicada: {politica}"
}
if "ofensivo" in analise:
return {
"status_da_moderacao": "Editar por linguagem inadequada",
"justificativa_final": f"{analise}. Política aplicada: {politica}"
}
return {
"status_da_moderacao": "Aprovado",
"justificativa_final": "Comentário sem violação."
}

7. Nó de aprovação direta

def aprovar_direto(state: AgentState):
return {
"status_da_moderacao": "Aprovado",
"justificativa_final": "Comentário positivo ou neutro, sem necessidade de revisão."
}

8. Construção do grafo

builder = StateGraph(AgentState)

builder.add_node("analisador", agente_analisador)
builder.add_node("pesquisador", agente_pesquisador)
builder.add_node("revisor", agente_revisor)
builder.add_node("aprovar", aprovar_direto)

builder.set_entry_point("analisador")

builder.add_conditional_edges(
"analisador",
rota_analise,
{
"pesquisador": "pesquisador",
"aprovar": "aprovar"
}
)

builder.add_edge("pesquisador", "revisor")
builder.add_edge("revisor", END)
builder.add_edge("aprovar", END)

graph = builder.compile()

9. Teste

entrada = {
"comentario_original": "Esse curso é lixo, comprem meu produto grátis aqui!"
}

resultado = graph.invoke(entrada)
print(resultado)

1 resposta

Olá, Moacir! Como vai?

Parabéns pela resolução das atividades!

E para compartilhar códigos de maneira ainda mais organizada aqui no fórum, você pode utilizar a opção abaixo:

Opção inserir bloco de código, da caixa de perguntas do fórum da alura

Após clicar, irá aparecer uma estrutura da seguinte maneira:

Opção de bloco de código sendo illustrada
O resultado será o seguinte:

Copie o seu código aqui

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!