A licença e o runtime

O wheel do stalwart-agents traz o runtime da Stalwart, compilado: o leitor que transforma cada turno em um plano, a verificação de ferramentas, as verificações de respostas, as verificações de código, a licença e a sua concessão, e os medidores. Ele roda na máquina que executa os seus agentes, de modo que nada de que um turno precisa espera pela rede, e os turnos dos seus usuários, as chamadas dos seus agentes e os seus documentos ficam ali.

O que é uma licença

Uma licença é esta máquina, ativada na sua conta Stalwart com a sua chave de API. A ativação abre uma concessão: a permissão do runtime para rodar por um período, renovada enquanto a máquina alcança a Stalwart e mantida por um período de carência quando não alcança. O seu plano define quantas máquinas podem ter uma concessão ao mesmo tempo, quanto duram a concessão e a carência, e os limites mensais que todas as máquinas da sua conta consomem juntas. O que cada plano inclui está em stalwart.it.

Ativar uma máquina

$ export QLS_API_KEY=qls_live_...
$ stalwart licence activate        # once on each machine
$ stalwart licence status          # the licence, the lease, the grace and the quota left
$ stalwart licence release         # frees this machine's place, for another to take

Uma máquina que não alcança a Stalwart é ativada por meio de outra que alcança, onde o seu plano inclui ativação offline:

$ stalwart licence request                          # on the machine to activate: writes activation-request.json
$ stalwart licence answer activation-request.json   # on a machine that reaches Stalwart: writes activation-answer.json
$ stalwart licence install activation-answer.json   # back on the first machine

O que funciona sem chave

Nada no pacote funciona sem uma chave de API e uma licença ativada, exceto o que você precisa para obtê-las:

Todo o resto precisa das duas: stalwart sources build e ask, trace, verify, serve, redteam, gateway, rules compile e catalogue import, e em Python Agent.chat, os planos e as verificações do cliente, a verificação de respostas, as respostas a partir de documentos e a verificação de código. Sem elas, cada um para com LicenceRequired (de stalwart_agents.errors), que nomeia stalwart licence activate e onde obter uma chave.

A biblioteca guarda as chaves

O runtime guarda a concessão na sua própria memória e a verifica dentro de cada operação que executa. As chaves que assinam os pacotes e os históricos do seu tenant nunca passam para o Python, e o próprio runtime lê o relógio e conta cada operação. stalwart_agents._runtime, o carregador por baixo, é interno: o cliente, os agentes e os comandos o chamam por você, e ele não é uma superfície sobre a qual construir.

Só contagens saem da máquina: quantos turnos foram lidos, chamadas verificadas e respostas retidas, informadas contra os limites mensais da sua conta. Um único total é mantido para a conta inteira, quantas máquinas a compartilharem.

Um processo guarda uma licença: cada verificação, resposta e plano nele é contado contra a concessão dessa licença. Um cliente de um segundo serviço (outro base_url) no mesmo processo é recusado, e a recusa diz isso; rode-o num processo próprio. Vários processos de uma máquina -- os workers de um servidor -- compartilham a concessão e o registro dela com segurança.

Cálculos

Um plano que precisa de um cálculo -- um total, uma média, uma diferença de datas -- o executa no seu próprio host, na imagem de contêiner qls-sandbox, quando um mecanismo de contêineres e a imagem estão presentes. Todo plano inclui execuções de cálculo: 100 execuções e 300 segundos por mês no plano gratuito, 10.000 execuções e 30.000 segundos no plano pago, e sem limite no enterprise. Client.compute, AsyncClient.compute e o nó de cálculo do LangGraph rodam pelo mesmo caminho. O runtime monta o prompt a partir da forma dos dados, nunca dos seus valores; o seu próprio modelo escreve a função; o runtime a admite -- nenhum socket, nenhum arquivo, nenhum import fora de uma lista curta -- e o sandbox a executa, sem rede. Nada disso sai do seu host: as execuções são contadas, e a contagem vai no relatório de uso. python -m stalwart_agents.sandbox baixa a imagem que esta versão executa. Onde a imagem não está, os planos trazem compute off: no seu motivo, e o on_unread do agente decide o que acontece com o turno (exemplos completos).

Onde o runtime não roda

O runtime é distribuído para Linux (x86-64 e arm64), macOS em Apple silicon e Windows (x86-64). Em qualquer outro lugar, planos e verificações de ferramentas vêm do qls-router enterprise que você executa no seu próprio ambiente: defina QLS_ROUTER_URL, ou Client(router_url=...). O roteador tem a sua própria concessão, de modo que o processo que o chama não precisa de uma local para planos e verificações. A mesma biblioteca vem embutida no roteador, que serve /v1/plans, /v1/tool-checks e /v1/tool-receipts, de modo que uma resposta é os mesmos bytes onde quer que seja calculada. A API hospedada da Stalwart não serve nenhuma das três.