SDK TypeScript · open source · MIT

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
Provider-agnostic Inferência sem as any Pronto pra produção
decisao-cobranca · run ao vivo
supervisor routes the team agent scorer-recuperacao agent seletor-de-acao historicoPagamentos context · blackboard conta · scoreRecuperacao · proximaAcao
stream de eventos tipados
supervisor.decision → invoke scorer-recuperacao
agent.tool_called historicoPagamentos
context.updated scoreRecuperacao = 0.72
agent.completed seletor-de-acao
project.completed proximaAcao = ligacao
funciona com a sua stack
OpenAI Anthropic Zod PostgreSQL Redis OpenTelemetry TypeScript
// por que Circuit AI

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.

// o modelo mental

É um time. Você descreve os papéis — o supervisor cuida do resto.

1

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.

2

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.

3

Você observa cada passo

run() devolve o contexto final tipado; stream() emite cada evento — para UI, auditoria ou replay. Tudo persiste no seu Storage.

Project

Nome, meta, o contexto tipado compartilhado, os agentes, o supervisor e tarefas opcionais.

Supervisor

Agente com privilégios. Lê todo o contexto e decide o próximo passo. Tem o próprio LLM.

Agent

Papel, meta, regras, um provider, schemas de entrada/saída e a fatia de contexto que lê.

Tool

Função tipada (schema Zod + handler) que o agente pode chamar durante o seu turno.

Context

O blackboard compartilhado — revalidado contra o schema a cada evento, sempre válido.

Task

Lista ordenada de passos de agentes, com filtros when condicionais (opcional).

// o time, em código

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)
  }
}
run · decisao-cobranca9 eventos
startproject.started
supdecision → invoke scorer-recuperacao
agtagent.started
toolhistoricoPagamentos
ctxscoreRecuperacao = 0.72
supdecision → invoke seletor-de-acao
agtagent.completed
ctxproximaAcao = ligacao
doneproject.completed
// Circuit AI Studio

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 Storage que você já usa.
Circuit AI Studio · localhost:3030
run_a91frunning
run_77c2paused
run_4d0ecompleted
run_1b83completed
// para quem constrói com IA

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.

decisões automatizadas

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.

aprovação humana

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 de análise

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 internos

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