Pi Agent: Event System & Command Registration
Última atualização: 2026-08-31
--- title: "Sistema de Eventos e Registro de Comandos" description: "Domine a arquitetura orientada a eventos do Pi Agent e o mecanismo de registro de comandos para tratamento personalizado de eventos e extensoes de comandos." order: 16 lang: pt-br
O sistema de eventos transforma o Agent de "você pergunta, ele responde" em verdadeira comunicação bidirecional.
1. Visão Geral do Sistema de Eventos
Pi Agent usa uma arquitetura orientada a eventos:
TEXT
📖 Somente leitura
Event Flow
Trigger Source → Event Bus → Handler
User input Dispatch/route Tool calls
Tool return Filter/sort UI updates
Timer Priority sort Logging
External msg Error routing Notifications
2. Eventos Integrados
| Evento | Gatilho | Dados |
|---|---|---|
| on_chat_start | Conversa começa | session_id |
| on_chat_end | Conversa termina | session_id, summary |
| on_user_message | Usuário envia mensagem | message |
| on_agent_response | Agent responde | response |
| on_tool_call | Ferramenta chamada | tool_name, params |
| on_tool_result | Ferramenta retorna resultado | tool_name, result |
| on_error | Erro ocorre | error, context |
| on_model_switch | Modelo trocado | old_model, new_model |
| on_context_overflow | Overflow de contexto | size, limit |
3. Escuta de Eventos
(1) Estilo Decorador
PYTHON
from pi_agent import Agent
agent = Agent(name="monitored")
@agent.on("tool_call")
def log_tool_call(event):
print(f"Tool called: {event.tool_name}({event.params})")
@agent.on("error")
def handle_error(event):
print(f"Error: {event.error}")
with open("error_log.txt", "a") as f:
f.write(f"{event.error}\n")
@agent.on("agent_response")
def log_response(event):
print(f"Token usage: {event.response.usage}")
(2) Estilo Classe
PYTHON
from pi_agent import Agent, EventHandler
class MyHandler(EventHandler):
def on_tool_call(self, event):
print(f"Tool: {event.tool_name}")
def on_tool_result(self, event):
print(f"Result: {event.result}")
def on_error(self, event):
print(f"Error: {event.error}")
agent = Agent(name="monitored", event_handler=MyHandler())
4. Eventos Personalizados
(1) Definir Evento
PYTHON
from pi_agent import Event
class DeployEvent(Event):
name = "deploy"
fields = ["environment", "status", "url"]
(2) Emitir Evento
PYTHON
agent.emit("deploy", {
"environment": "production",
"status": "success",
"url": "https://myapp.example.com"
})
(3) Escutar Evento Personalizado
PYTHON
@agent.on("deploy")
def on_deploy(event):
if event.status == "success":
send_notification(f"Deploy succeeded: {event.url}")
5. Registro de Comandos
(1) Registrar Comandos Interativos
PYTHON
from pi_agent import Agent
agent = Agent(name="custom_cmd")
@agent.command("/deploy", description="Deploy project to specified environment")
def deploy_cmd(args: str):
env = args.strip() or "staging"
result = agent.run(f"Deploy current project to {env}")
print(result)
@agent.command("/review", description="Review code in specified file")
def review_cmd(args: str):
filename = args.strip()
result = agent.run(skill="code_review", file=filename)
print(result)
@agent.command("/cost", description="Show token usage stats for current session")
def cost_cmd(args: str):
usage = agent.session.get_usage()
print(f"Token usage: {usage.total_tokens}")
print(f"Estimated cost: ${usage.estimated_cost:.4f}")
6. Filtros de Eventos
(1) Filtragem Condicional
PYTHON
@agent.on("tool_call", filter=lambda e: e.tool_name == "shell")
def log_shell_calls(event):
print(f"Shell command: {event.params.get('cmd')}")
(2) Prioridade
PYTHON
@agent.on("error", priority=10)
def critical_error(event):
send_alert(f"Critical error: {event.error}")
@agent.on("error", priority=1)
def log_error(event):
with open("errors.log", "a") as f:
f.write(f"{event.error}\n")
❓ Perguntas Frequentes
P: Handlers de eventos podem modificar dados do evento? R: Sim, mas é recomendado apenas ler para evitar efeitos colaterais. Dados modificados são visíveis para handlers subsequentes. P: Tratamento de eventos síncrono ou assíncrono? R: Padrão síncrono, executado por prioridade. Use
async_handler=Truepara handlers assíncronos. P: Comandos vs comandos com barra? R: Comandos são extensões personalizadas via@agent.command(). Comandos com barra são comandos integrados do modo interativo (/help, /exit). Mesmo formato, fontes diferentes.
❓ Resumo
- Orientado a eventos: gatilho → barramento de eventos → handler
- 9 eventos integrados cobrindo o ciclo de vida completo do Agent
- Dois estilos de escuta: decorador e classe EventHandler
- Eventos personalizados e registro de comandos estendem capacidades interativas
- Filtros e prioridade controlam o processamento de eventos
📝 Exercícios
- Básico (Dificuldade: ⭐): Escute eventos tool_call, registre todas as chamadas de ferramentas em um arquivo.
- Intermediário (Dificuldade: ⭐⭐): Crie um comando /summarize que gere um resumo da sessão.
- Avançado (Dificuldade: ⭐⭐⭐): Implemente um pipeline de deploy orientado a eventos: revisão de código → teste → deploy, cada estágio acionado por eventos.