Whisperops
Ver no GitHub →A ideia inicial desse projeto foi colocar à prova alguns conceitos de DevOps e SRE e, de quebra, testar alguma feature com IA diretamente.
Principais Destaques
Pois bem, existem algumas formas de ler esse projeto, que, aos poucos, se tornou um pequeno monstrinho.
-
Do ponto de vista de funcionalidade para o usuário final, trata-se de um projeto extremamente simples. O usuário cria o seu próprio agente para analisar um CSV qualquer. A plataforma cria dois agentes que conversam entre si, o
plannere oworker, onde o usuário interage com oplanneratravés de um frontend de chat, fazendo perguntas sobre o dataset. Oworker, por sua vez, tem instruções definidas para rodar comandos Python em um sandbox, analisar o dataset, gerar uma resposta determinística e, quando achar necessário, adicionar também um gráfico interativo na resposta do chat. -
Já do ponto de vista da aplicação, temos alguns recursos interessantes como objeto de estudo aqui:
-
O primeiro e mais relevante deles é o uso do IDP (Backstage usando CNOE) integrado com ArgoCD e Crossplane Compositions. Em vez de termos vários templates Nunjucks, temos uma Composition
XDatasetAgentpassando por um pipeline do Crossplane com 6 funções (validate-dataset → compute-tuning → render-iam → render-workloads → render-dashboard → emit-budget) que, no fim da cadeia, cria e gerencia cerca de 22 recursos do k8s e GCP. Há 100% de controle multi-tenant sobre cada deploy, onde, pela própria UI do IDP, é possível controlar o ciclo de vida de cada agent-app, trocando configurações (controle de budget, troca de dataset, etc.) e deletando todo o contexto de forma isolada e segura. Todas as ações realizadas também são auditáveis e monitoráveis. -
Cada agent-app possui um budget configurável via IDP e com 100% de observabilidade dentro do ciclo de vida do agent. Quando o budget predefinido atinge 100%, o chat para de funcionar imediatamente.
-
-
O projeto conta com um bundle de observabilidade bem completo, usando uma stack full LGTM (OTel Collector, Grafana Alloy, Mimir e Loki) e entregando 9 dashboards extremamente detalhados, além de mais um dashboard para cada agent-app deployado (também controlado pelo fluxo do IDP + Compositions). Esse talvez seja um dos pontos mais fortes desse projeto.
-
Cluster Health (USE Method) 🖥️ A saúde da máquina por baixo de tudo. Utilization/Saturation/Errors de CPU, memória, disco e rede do node, além de OOMKills, restarts de containers e pods fora de Running. Se a VM
e2-standard-8sufocar, você vê aqui primeiro. -
LLM Platform Overview 🤖 A visão de topo do produto. RED do chat (req/min, erro %), TTFT p50/p95, tokens/min in+out, agentes ativos, turnos de conversa e execuções do sandbox. O “single pane” para saber se a plataforma de agentes está saudável.
-
Agent Lifecycle Activity 📋 Trilha de auditoria Day-2. Quantos agentes foram scaffoldados, ações nas últimas 24h, quem fez (top actors), destroys recentes e breakdown por agente/tipo. Responde “quem mexeu em quê e quando” via logs do Loki.
-
SLO Compliance 🎯 Os contratos de confiabilidade. Availability 99%, TTFT@30s 95%, sandbox success 99%, com error-budget restante e burn-rate multi-window. É o painel que dispara, e justifica, os alertas de SLO.
-
Service Map 🕸️ A topologia via Tempo spanmetrics + service-graphs. Grafo de dependências (chat→planner→worker→sandbox A2A), calls/min, p95 e erro % por serviço, operações mais lentas e arestas inter-serviço. Onde a latência mora no caminho.
-
Cost & Token Economics 💰 O dinheiro. Custo lifetime, spend rate $/min, budget total vs restante por agente, throughput de tokens (in/out/cached), cache hit rate, economia acumulada de cache e custo por turno. Calibrado para o pricing do Gemini.
-
RED Method (per service) 🔴 RED granular por serviço, não agregado. Rate/Errors/Duration separados para chat-frontend, sandbox e planner, incluindo erros do sandbox por tipo. Quando o D2 acusa problema, este isola qual serviço é o culpado.
-
Apdex per Agent 😊 Satisfação do usuário traduzida em número. Apdex por agente (T=30s, tolerável=90s, calibrado para o Pro): satisfeito/tolerável/frustrado por TTFT, percentis, heatmap e quais agentes caíram na “frustrated zone” (<0.7).
-
ArgoCD + Crossplane Platform Health ⚙️ A saúde do GitOps/control-plane. Apps ArgoCD Synced/Healthy, latência de reconcile, sync churn, decisões/violações do Kyverno por policy, fase dos pods Crossplane e restarts de provider. O painel de “a plataforma que roda a plataforma”.
-
Per-Agent Detail 🔍 Um dashboard gerado automaticamente para cada agente no scaffold. Mostra, filtrado apenas para aquele agente, a saúde (availability, TTFT, Apdex), o custo (spend vs budget), uso de tokens/sandbox e recursos, além de logs e traces. Serve para investigar a fundo um agente específico quando ele se comporta mal.
-
-
E, não menos importante, também configurei alguns guardrails de segurança interessantes para o cenário desse projeto:
-
Sandbox blindado: o código gerado pelo LLM roda como não-root, com filesystem read-only, sem capabilities e sem token do K8s, a fim de evitar prompt injection e afins.
-
Egress default-deny: o sandbox fala apenas com GCS, DNS e OTel; qualquer tentativa de exfiltração para fora do cluster é bloqueada pela NetworkPolicy.
-
Nenhum Git Secret: todas as chaves de SA são geradas a cada deploy e rotacionadas, portanto não há credencial commitada nem persistida.
-
IAM least-privilege: cada SA tem apenas o papel mínimo (Vertex = inferência; agente = apenas seu próprio bucket), limitando o estrago se uma chave vazar.
-
Kyverno admission cluster-wide: 6 políticas bloqueiam imagens de registries não confiáveis, containers privilegiados e pods sem resource limits.
-
Day-2 com SSO + RBAC mínimo: ações operacionais exigem login Keycloak (built-in no CNOE) e rodam sob um SA que não pode criar agentes nem se auto-conceder permissão.
-
Trilha de auditoria: toda ação Day-2 registra ator, ação e agente no Loki, dando rastreabilidade total sobre qualquer ação do IDP.
-
Riscos residuais assumidos: bootstrap SA amplo, ~60s de latência no budget e key da Vertex replicada, todos documentados com o caminho de mitigação (GKE + Workload Identity).
-
Outras funcionalidades
-
O controle dos datasets é feito em um bucket do GCP, onde podemos fazer o upload diretamente de qualquer CSV. Ao criar um agent-app, o IDP mostra um menu drop-down com todos os CSVs disponíveis no bucket. Essa feature também funciona via Compositions (
XDataset), que monitora o estado do bucket, valida os CSVs, faz algumas normalizações e os disponibiliza no IDP de forma recorrente. -
O controle de budget dos agentes também é feito através de uma Composition (
XAgentBudget) que passa por um pipeline de 3 steps (fetch-spentobtém o valor gasto através do Mimir,decideanalisa o resultado do ratio e, por fim, orenderatualiza os Deployments dos agents de acordo com o resultado). -
O projeto foi pensado para ser um one-shot deploy por se tratar de uma demonstração. Todos os principais recursos do projeto são GitOps first, então, para agilizar o processo de deploy, existe um Makefile que sobe a infra com Terraform, gera as imagens e sobe todo o código da estrutura para um Gitea no próprio cluster. O processo de deploy demora cerca de 30 minutos e é totalmente idempotente.
-
Não é bem uma funcionalidade, porém, dentro do diretório docs, existem muitos diagramas e explicações sobre cada layer do projeto. São documentações técnicas e detalhadas sobre cada decisão do projeto. Em breve, vou discorrer mais sobre alguns detalhes em posts específicos desse blog.
-
Esse projeto foi inteiramente desenvolvido usando Spec Driven Development com Claude. O framework escolhido para executar o projeto foi um fork pessoal do AgentSpec.