Diário
EngenhariaPublicado em 2026-04-08·9 min de leitura

Projetando o Flux Engine: um runtime para todo produto

Um espiar nas escolhas de arquitetura por trás do nosso runtime de inferência compartilhada no dispositivo — e nas restrições que o moldaram.

Um runtime, não um wrapper

Construir um app no dispositivo é difícil. Construir cinco é mais difícil. Construir cinco que compartilhem uma fundação técnica coerente, lancem updates no mesmo passo e nunca regridam em bateria — esse é problema de runtime.

Flux Engine é a nossa resposta. Uma camada fina e opinativa por cima dos melhores runtimes open source de cada faixa — voz (whisper.cpp / faster-whisper), visão (llama.cpp / mlx-vlm), linguagem (llama.cpp / MLC-LLM, executorch no Android) — coordenada por um único scheduler que sabe o que está em memória, o que o usuário está fazendo e o quanto o dispositivo aguenta.

As três restrições

1. Latência de cold start

Os modelos vivem em disco a maior parte do tempo. O usuário não. Flux Engine pré-aquece o modelo mais provável de ser chamado a seguir, com base nos padrões de uso do app e em um pequeno classificador no dispositivo. O classificador em si é um MLP de 50 KB — leve o bastante para rodar a cada wake.

2. Throughput sustentado em NPUs pequenas

Nunca disparamos cargas paralelas que disputam o mesmo acelerador. O scheduler é baseado em filas, sabe prioridades e cede o passo à app em primeiro plano. Stream de ASR tem prioridade sobre um resumo em background; tap-to-translate tem prioridade sobre uma passagem de indexação.

3. Degradação graciosa quando há pouca memória

Se o usuário está editando vídeo 4K, não vamos derrubar o telefone com OOM por causa de um resumo. O motor reporta um sinal soft de "capacidade restante" que os produtos respeitam — podem cair para um modelo menor, adiar para o background, ou exibir "pronto quando o aparelho esfriar".

O que o Flux Engine realmente expõe

Um punhado de abstrações C++ e bindings finos em Swift / Kotlin / Rust:

  • FluxSession — sessão de inferência de vida longa atrelada a modelo + dispositivo.
  • FluxStream — saída incremental, cancelável no meio do token.
  • FluxBudget — relatório de capacidade ciente do dispositivo.
  • FluxRouter — escolhe o modelo certo baseado em faixa do dispositivo, bateria, estado térmico e preferência do produto.

É isso. Cinco primitivas. Cada produto Flux* se constrói em cima disso.

O que isso nos dá

Um bug fix, um ganho de performance, uma melhora de quantização — cinco produtos melhoram ao mesmo tempo. Um fix de regressão no scheduler — cinco produtos param de bater pico de bateria ao mesmo tempo. A conta econômica de um runtime compartilhado, para uma equipe do nosso tamanho, é esmagadora.

O que erramos

  • Investimos demais num compilador de grafos nos primeiros seis meses. Os loaders ajustados a mão venceram.
  • Investimos de menos em profiling. Reescrevemos no nono mês.
  • Assumimos um esquema único de quantização para todos os produtos. Hoje entregamos misturas por produto.

Receba novos artigos

Avisaremos quando publicarmos algo novo.

Inscrever