Um registro de adapters de modelo que nunca lançam exceções, com circuit breakers, retries e contabilidade de custo.
@alembic/adapters é o único lugar onde o motor toca um LLM. Ele fornece adapters para servidores locais compatíveis com OpenAI, um gateway local cliproxyapi, Anthropic, agents baseados em CLI e um stub offline determinístico.
Todo adapter obedece ao mesmo contrato: run(input) retorna um Result. Se a rede falhar, o breaker abrir ou o modelo recusar, você recebe um objeto de falha tipado — nunca uma exceção lançada.
Pense assim… um adaptador de energia universal: a tomada muda, mas seu dispositivo sempre vê a mesma voltagem e plug.
A espinha canônica é runWithGuards: validar input → circuit breaker → retry com backoff → tentar o transporte → parse usage → computar custo → retornar ModelRunResult. Adapters concretos apenas implementam a função attempt específica do transporte. createAdapterRegistry conecta adapters em um Map; pickAdapter roteia por tier sem fallback silencioso.
# execução hermética usa o adapter offline alembic distill ./corpus --offline # execução live roteia pelo registro padrão alembic distill ./corpus
createAdapterRegistry({ offline: { asDefault: true } }) registra apenas o adapter offline e o torna o padrão. Em modo live, cliproxyapi é sempre registrado e aponta para http://127.0.0.1:8317. A CLI faz preflight do registro antes de executar comandos caros para que credenciais faltantes falhem rápido.
Execute um comando com --offline e depois sem ele (se seu gateway estiver ativo). Compare o custo reportado na saída.
pickAdapter(Tier.T3, registry) retornar um erro, onde está o bug mais provável — o registro ou o caller?