38 · Licenças, uso offline e o que precisa da rede¶
Idiomas
O seletor entende turnos escritos em inglês. O português é a sua próxima gramática e ainda não foi lançado; até lá, um turno escrito em português não é lido como português.
O pacote stalwart-agents traz o runtime da Stalwart, compilado: o leitor que transforma cada turno num plano,
a verificação de ferramentas, as verificações de resposta, a recuperação de passagens, as verificações de
código, a licença e os medidores. Ele roda no seu processo, na sua máquina. Uma licença é o que o deixa rodar
ali: esta máquina, ativada uma vez na sua conta. Este capítulo é o que roda na máquina e o que precisa do nosso
serviço, como uma licença é ativada, mantida e liberada, e o que acontece quando ela expira.
O que roda onde¶
Onde o runtime está instalado, um turno e uma chamada de ferramenta não precisam de rede: o runtime responde aos dois na máquina que executa o seu agente.
O que acontece uma vez, antes da implantação ou em segundo plano pode usar o nosso serviço. Cada linha está ligada ao código que faz o trabalho, a operação do runtime ou a rota do serviço, e é gerada a partir dele:
| Trabalho | Onde roda | Rede |
|---|---|---|
| ler um turno num plano | o runtime, no seu processo | nenhuma |
| verificar uma chamada de ferramenta: o catálogo, os argumentos, o histórico, as regras de ordem, o portão do rulebook, as marcas, os tokens de confirmação | o runtime, no seu processo | nenhuma |
| conferir uma resposta com o que foi feito, e examinar turnos e respostas em busca de dados pessoais | o runtime, no seu processo | nenhuma |
| indexar os seus documentos, recuperar passagens e conferir uma resposta com elas | o runtime, no seu processo | nenhuma; compose chama o seu próprio modelo, com a sua chave |
as verificações de código do stalwart verify |
o runtime, no seu processo | nenhuma; só as contagens por regra vão com o registro |
| o lint de um catálogo | o runtime, no seu processo | nenhuma |
| a etapa de ferramenta protegida, desfazer uma execução que falhou, o retrocesso, as pausas por uma pessoa e a retomada | o pacote, sobre o runtime, no seu processo | nenhuma, exceto as chamadas que as suas próprias ferramentas fazem |
| as verificações do gateway | o pacote, sobre o runtime, no seu processo | nenhuma, exceto as chamadas que ele repassa aos seus servidores de ferramentas |
| um cálculo: o seu modelo escreve a função e a imagem do sandbox a executa, na sua máquina | o pacote, sobre o runtime, no seu processo | a chamada ao seu modelo; a função em si roda sem rede |
| registrar um catálogo e o seu rulebook | o nosso serviço | no stalwart verify e no início de um agente, quando a versão mais recente não o contém |
| a caça e a prova do grafo de um agente | o nosso serviço | antes da implantação: no stalwart verify, e uma vez por grafo antes do primeiro turno de um agente |
| ativar a licença e renovar a concessão | o nosso serviço | uma vez na ativação, depois em segundo plano; o runtime segue rodando durante o período de carência sem ela |
| relatar o uso: só contagens | o nosso serviço | em segundo plano, com a renovação da concessão |
| os pacotes de vocabulário e de catálogo que o runtime lê | o nosso serviço | em segundo plano; um pacote novo é adotado numa renovação da concessão, nunca no meio de uma conversa |
| os polegares dos seus usuários, para o minerador | o nosso serviço | só quando você os envia |
Ativando¶
$ export QLS_API_KEY=qls_live_...
$ stalwart licence activate # uma vez em cada máquina
$ stalwart licence status # a licença, a concessão, a carência e o que resta de cada limite
$ stalwart licence release # libera o lugar desta máquina, para outra ocupar
A ativação cria a instalação desta máquina -- um id aleatório e um par de chaves, nunca uma impressão digital do hardware -- e troca a sua chave pela licença da sua organização e uma primeira concessão: a permissão do runtime para rodar aqui até uma data. O seu plano define quantas máquinas podem ter uma concessão ao mesmo tempo, quanto tempo dura uma concessão, o período de carência depois dela, e se uma máquina pode ser ativada sem nenhuma conexão:
| A licença do runtime local | Gratuito | Pago | Enterprise |
|---|---|---|---|
installations: máquinas com uma concessão ao mesmo tempo |
1 | 5 | 50 |
lease_days: dias que uma concessão dura antes de ser renovada |
7 | 7 | 7 |
offline_grace_days: dias que o runtime continua funcionando além da concessão sem nos alcançar |
7 | 30 | 30 |
offline_activation: ativar uma máquina que nunca alcança a rede, por arquivo de pedido |
não | não | sim |
Nada no pacote funciona sem uma chave e uma licença ativada, exceto ativá-la, stalwart doctor e
stalwart check. Sem elas, um comando para com LicenceRequired, nomeando stalwart licence activate.
A concessão, a sua renovação e o período de carência¶
A primeira resposta que o runtime dá num processo renova a concessão com o nosso serviço, de modo que um plano
cancelado ou uma licença revogada param o runtime na hora; a mesma renovação busca os pacotes de catálogo e de
vocabulário e relata as contagens. Quando o serviço não pode ser alcançado, o runtime abre a última concessão
como ela está: dentro do prazo dela, e depois dentro do período de carência, ele responde normalmente, e
stalwart doctor e stalwart licence status mostram o estado, active ou grace, e as datas em que a
concessão e a carência terminam.
Rodando offline¶
O agente da loja do capítulo 30. Ele inicia com a rede, que prova o seu grafo e registra o seu catálogo:
desk = Agent.from_file("agent.yaml")
desk.chat("show me order 4412", user="u-0") # start-up, with the network: the proof and the registration
Depois a rede é cortada, com todo socket recusado, e o agente segue:
# The network is cut here: from now on nothing leaves the machine.
reply = desk.chat("show me order 4411", user="u-17")
print(reply.text)
reply = desk.chat("charge order 4411 40.00", user="u-17")
print(reply.waiting[0].tool, "waits:", reply.waiting[0].wording)
reply = desk.confirm("u-17", "approve")
print(reply.text)
{"card": "visa-0019", "customer": "c-208", "order_id": "4411", "status": "unpaid", "total": "40.00"}
charge_card waits: Run charge_card?
{"amount": "40", "charge_id": "ch-4411", "order_id": "4411"}
A leitura foi respondida, a cobrança verificada e perguntada, e a cobrança aprovada executada, sem que nada saísse da máquina além da chamada à própria ferramenta da loja.
Quando a licença expira¶
Uma concessão e a sua carência já vencidas, ou a licença expirada, é uma licença expirada. Um produto de
segurança não pode falhar aberto, e um agente em produção não pode parar sem aviso, então uma expiração degrada
conforme a configuração on_licence_lapse da sua organização:
reads_only, o padrão: os turnos são lidos normalmente, as leituras são verificadas normalmente, e toda escrita é recusada comolicence_lapsed.refuse: toda operação é recusada comolicence_lapsed, com a data em que a expiração começou.
O mesmo agente, depois que a licença dele expirou:
# The licence has lapsed, and the organisation's setting is `reads_only`.
reply = desk.chat("show me order 4411", user="u-18")
print(reply.text)
reply = desk.chat("charge order 4411 40.00", user="u-18")
print(reply.text)
{"card": "visa-0019", "customer": "c-208", "order_id": "4411", "status": "unpaid", "total": "40.00"}
The licence for this agent has lapsed, so charge_card was not run.
Nada que um runtime licenciado teria recusado é permitido durante uma expiração.
Máquinas sem conexão¶
Onde o seu plano permite a ativação offline, uma máquina que nunca alcança a Stalwart é ativada por arquivo, através de uma que alcança:
$ stalwart licence request # na máquina a ativar: escreve activation-request.json
$ stalwart licence answer activation-request.json # numa máquina que alcança a Stalwart: escreve activation-answer.json
$ stalwart licence install activation-answer.json # de volta na primeira máquina
A resposta traz a licença e uma concessão para todo o prazo da licença. Uma empresa pode, em vez disso, rodar o
qls-licence-server na própria rede, que emite concessões para as suas máquinas como o serviço de licenças faz.
Liberando um lugar¶
stalwart licence release libera o lugar desta máquina na licença, para que outra máquina possa ocupá-lo: o que
um job de CI faz por último (capítulo 46).
O que é contado, e o que é relatado¶
O runtime conta cada medidor que o seu plano nomeia -- plan_calls, tool_checks, answer_calls e as
contagens das verificações de resposta, entre eles -- no seu próprio estado, no seu próprio relógio. Passado um
limite, ele responde quota_exhausted, nomeando o medidor, como o serviço faz. Contagens, e só contagens,
são relatadas: nunca um turno, um argumento, um resultado, uma resposta ou um documento. Os limites do seu
plano estão no capítulo 16.
stalwart doctor e stalwart licence¶
stalwart doctorimprime a URL base, se uma chave está configurada (nunca a chave), qual lado responde os planos e as verificações de ferramentas -- o runtime local ou o seuqls-router-- com o estado da licença, a ida e volta até o serviço, o seu nível, os seus direitos e o uso de cada medidor neste mês, e se o streaming chega até você pela sua rede. Ele funciona sem licença, para dizer o que falta.stalwart licenceaceitaactivate,request,answer,install,releaseestatus.
Os limites¶
- Código compilado e pacotes cifrados dificultam a leitura; não a impedem. Alguém determinado, com uma instalação licenciada, pode extrair o que ela roda. Os termos da licença e o seu contrato são o que impede isso.
- Alguns trabalhos ainda precisam do nosso serviço: a caça e a prova do grafo de um agente, o registro de um catálogo e do seu rulebook, a ativação e a renovação de uma licença, e o minerador. O primeiro início de um agente prova o seu grafo e registra o seu catálogo ali; uma máquina que nunca alcança o serviço roda só com a sua concessão e a carência.
- Onde o runtime não está instalado -- uma plataforma para a qual o wheel não é distribuído -- os planos e as
verificações de ferramentas vêm do seu próprio
qls-router, e a nossa API hospedada não responde a nenhum dos dois.