Orquestre times de agentes de IA, com tipos de ponta a ponta.
O SDK TypeScript para coordenar agentes como um time: cada um com papel, meta e regras, e um supervisor que roteia o trabalho sobre um contexto tipado com Zod. Runs duráveis, cada passo observável — do protótipo à produção.
pnpm add @blull/circuitai zod
as any
Pronto pra produção
Tudo que um time de agentes precisa para chegar à produção.
Tipos de ponta a ponta, orquestração dinâmica, durabilidade e observabilidade — sem amarrar você a um framework ou a um provedor.
Tipado de ponta a ponta com Zod
Um schema Zod para o contexto, para a entrada/saída de cada
agente e para cada tool. A inferência flui de
defineProject até project.run(). Sem
as any. Sem DSL.
Orquestração hierárquica, não fiação de grafo
Sem DAGs para desenhar. Um supervisor LLM roteia o trabalho dinamicamente com base no contexto tipado. Suas regras de roteamento em português puro.
Durabilidade nativa
Todo run é uma sequência de eventos tipados sobre um contexto
tipado. In-memory de fábrica; adapters de primeira classe para
Postgres e Redis — ou implemente o
seu.
Tools e observabilidade de primeira classe
Defina ferramentas com schema Zod; o SDK roda o loop model → tool → model com validação e retries. Cada passo é um evento que você faz stream, log ou replay.
Humano no circuito (HITL)
Pause & resume sobre um checkpoint durável no log de eventos. Proponha a ação, espere a aprovação humana, execute — mesmo em outro processo, sem refazer trabalho.
Grafos visualizáveis & o Studio
project.toJSON() exporta seu time como JSON Schema.
Versione no git, ou abra no
Studio —
visualizador de grafo e debugger de runs ao vivo, com resume no
navegador.
É um time. Você descreve os papéis — o supervisor cuida do resto.
Defina o contexto e os agentes
Um contexto tipado (o blackboard) e agentes com
papel, meta, regras e schemas. Cada agente lê só a fatia do
contexto que precisa, via contextSelector.
O supervisor roteia o trabalho
A cada turno ele lê o contexto e decide: invocar um agente, rodar uma tarefa, concluir ou pausar para um humano. A escolha é validada por um discriminated union do Zod.
Você observa cada passo
run() devolve o contexto final tipado;
stream() emite cada evento — para UI, auditoria
ou replay. Tudo persiste no seu Storage.
Nome, meta, o contexto tipado compartilhado, os agentes, o supervisor e tarefas opcionais.
Agente com privilégios. Lê todo o contexto e decide o próximo passo. Tem o próprio LLM.
Papel, meta, regras, um provider, schemas de entrada/saída e a fatia de contexto que lê.
Função tipada (schema Zod + handler) que o agente pode chamar durante o seu turno.
O blackboard compartilhado — revalidado contra o schema a cada evento, sempre válido.
Lista ordenada de passos de agentes, com filtros
when condicionais (opcional).
Código real, do schema ao run. Sem mágica.
Um exemplo de decisão de cobrança: pontuar a recuperabilidade de uma conta e rotear para a próxima melhor ação.
import { z } from 'zod'
import { defineAgent, defineProject, defineSupervisor, defineTool } from '@blull/circuitai'
// O contexto compartilhado — o "blackboard" do time, tipado com Zod.
const Contexto = z.object({
conta: z.object({ id: z.string(), valorEmAberto: z.number(), diasEmAtraso: z.number() }),
scoreRecuperacao: z.number().min(0).max(1).optional(),
proximaAcao: z.enum(['sms', 'ligacao', 'acordo', 'juridico']).optional(),
})
type Ctx = z.infer<typeof Contexto>
// Uma ferramenta tipada que o agente pode chamar no seu turno.
const historicoPagamentos = defineTool({
name: 'historicoPagamentos',
description: 'Busca o histórico de pagamentos de 90 dias do devedor.',
schema: z.object({ contaId: z.string() }),
handler: async ({ contaId }) => ({ contaId, promessasQuebradas: 2 }),
})
// Um agente: papel, meta, regras, schemas e a fatia de contexto que lê.
const scorer = defineAgent({
name: 'scorer-recuperacao',
goal: 'Estimar a probabilidade de recuperar esta conta em atraso',
rules: 'Você é analista de crédito. Responda apenas em JSON.',
model: openai,
outputSchema: z.object({ scoreRecuperacao: z.number().min(0).max(1) }),
contextSelector: (ctx: Ctx) => ({ conta: ctx.conta }),
tools: [historicoPagamentos],
})
// O projeto reúne o time e um supervisor que roteia o trabalho.
const projeto = defineProject({
name: 'decisao-cobranca',
goal: 'Definir a próxima melhor ação para cada conta em atraso',
contextSchema: Contexto,
agents: [scorer, seletorDeAcao],
supervisor: defineSupervisor<Ctx>({
model: openai,
rules: 'Calcule o score, depois escolha a ação. Pare quando proximaAcao existir.',
terminationCondition: (ctx) => ctx.proximaAcao !== undefined,
maxTurns: 8,
}),
})
// run() roda até o fim e devolve o contexto final, já tipado.
const final = await projeto.run({
conta: { id: 'acc_1042', valorEmAberto: 4200, diasEmAtraso: 47 },
})
console.log(final.proximaAcao)
// 'sms' | 'ligacao' | 'acordo' | 'juridico'
// ...ou faça stream de cada passo como eventos tipados —
// para UI ao vivo, log ou replay.
for await (const ev of projeto.stream(contextoInicial)) {
switch (ev.type) {
case 'agent.started':
ui.marcarAtivo(ev.agent)
break
case 'agent.tool_called':
log.info('tool', ev.tool)
break
case 'context.updated':
ui.patch(ev.patch)
break
case 'project.completed':
console.log(ev.context)
break
}
}
// O supervisor pausa o run e persiste um checkpoint durável...
supervisor: defineSupervisor({
model: openai,
rules: 'Prepare a ação e só execute após aprovada.',
terminationCondition: (ctx) => ctx.executado === true,
pauseCondition: (ctx) =>
ctx.preparado && !ctx.aprovacao
? { reason: 'aprovação necessária', awaiting: 'aprovar | rejeitar' }
: undefined,
})
// ...e qualquer processo retoma de onde parou, sem refazer
// nenhum trabalho já concluído.
for await (const ev of projeto.resume(runId, {
input: { aprovacao: 'aprovado' },
})) {
if (ev.type === 'project.completed') {
console.log(ev.context)
}
}
Veja seu time rodando.
Um servidor self-hostable que visualiza o grafo do projeto e depura runs — replay de um run finalizado, live-tail de um em andamento e resume de runs pausados (HITL) direto do navegador.
- Grafo supervisor → agentes → tools, com o nó ativo destacado conforme o run flui.
- Timeline com scrubber por passo: snapshot do contexto, diff, e totais de tokens/custo.
-
Zero novas dependências de runtime — roda sobre o
Storageque você já usa.
De automações internas a produtos com IA em produção.
Se o trabalho exige mais de um passo de raciocínio, ferramentas e uma trilha de auditoria, é um time de agentes — e o Circuit AI foi feito para isso.
Motores de decisão com auditoria
Pontue, classifique e roteie — cobrança, risco, priorização, triagem. Cada decisão fica registrada como um log de eventos tipado, pronto para auditoria e replay.
Fluxos com humano no circuito
O agente propõe, uma pessoa aprova, o run continua — em outro processo, dias depois, sem refazer trabalho. Ideal para ações sensíveis ou reguladas.
Pipelines multi-etapa com ferramentas
Encadeie agentes que buscam dados, raciocinam e produzem saídas estruturadas e validadas — com retries automáticos quando uma tool ou um schema falha.
Copilotos e automação de back-office
Times de agentes que operam sobre os seus sistemas via tools tipadas, com streaming de tokens para UIs ao vivo e observabilidade via OpenTelemetry.
Construa seu time de agentes hoje.
Open source, MIT, type-safe de ponta a ponta. Instale e tenha seu primeiro run em minutos.
pnpm add @blull/circuitai zod