Obter um lease e liberá-lo de novo
Obtenha um lease exclusivo sobre um recurso com coordination.lease, veja quem o detém e libere-o quando terminar.
coordination.lease
Obtenha um lease exclusivo sobre um recurso com coordination.lease, veja quem o detém e libere-o quando terminar.
coordination.leasePasse ações de agentes, hashes de conteúdo, checagens de API, DNS, webhooks, chamadas de LLM e commits git pela Intramedial. Receba um recibo assinado que todos verificam – sem confiar em nós.
Dois agentes não devem fazer deploy em produção ao mesmo tempo. Você dá um lease ao recurso: o primeiro agente o detém, o segundo é recusado e informado de quem o detém e de quanto tempo esperar. Um lease que nunca é liberado expira sozinho.
O código lê a chave de INTRAMEDIAL_KEY. Guarde-a no seu shell ou no seu cofre de segredos, nunca em um arquivo que você faz commit. Chamadas que exigem uma pessoa logada não podem usar chave: o console as faz.
Peça o recurso como o agente que o quer. Um recurso livre devolve um lease com validade.
Um recurso livre responde { ok: true, lease }. O lease traz seu id, titular e validade.
{
"ok": true,
"lease": {
"id": "lease_4c1e",
"resource": "lock:deploy/production",
"holder": "did:web:acme.example:agent:release",
"expiresAtMs": ,
: { : , : [] },
: ,
: {}
}
}lease_held.coordination.leasecoordination-lease
curl -sS -X POST https://api.intramedial.com/api/v1/acp/coordination/lease \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:release"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/coordination/lease", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
resource: "lock:deploy/production",
actorDid: "did:web:acme.example:agent:release",
}),
});
console.log(res.status, await res.json());import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/coordination/lease",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:release",
},
timeout=30,
)
print(res.status_code, res.json())Um segundo agente que pede o mesmo recurso é recusado com lease_held, o DID do titular e um back-off em stampede.waitMs. Todo lease dura o padrão de 30.000 ms; a rota não lê ttlMs.
curl -sS -X POST https://api.intramedial.com/api/v1/acp/coordination/lease \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:cost"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/coordination/lease", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
resource: "lock:deploy/production",
actorDid: "did:web:acme.example:agent:cost",
}),
});
const body = await res.json();
if (!body.ok) console.log(body.reason, "held by", body.holder, "wait", body.stampede?.waitMs, "ms");import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/coordination/lease",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:cost",
},
timeout=30,
)
body = res.json()
if not body.get("ok"):
print(body["reason"], "held by", body["holder"], "wait", body["stampede"]["waitMs"], "ms")Envie o recurso e o agente; release responde released e releasedIds. Um lease nunca liberado expira e um alarme o retoma.
curl -sS -X POST https://api.intramedial.com/api/v1/acp/coordination/release \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:release"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/coordination/release", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
resource: "lock:deploy/production",
actorDid: "did:web:acme.example:agent:release",
}),
});
console.log(res.status, await res.json());import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/coordination/release",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:release",
},
timeout=30,
)
print(res.status_code, res.json())Copiado de: /docs/coordination-lease
O livro-razão é somente de acréscimo e selado sob raízes Merkle. A hora de uma entrada é o relógio da própria Intramedial, e um bundle assinado pode ser conferido offline com a chave publicada.
Peça um lease ocupado, leia o back-off que o plano indica e tente de novo até o slot ser seu.
coordination.leaseDeclare o que um agente está prestes a fazer em um recurso e deixe o plano conferir contra os claims abertos.
civics.claimsMantenha um lease sobre uma role, assuma-a pelo plano para obter uma credencial curta, use-a e libere o lease.
iam.assumecoordination.leaseUm e-mail curto quando somamos receitas. Nenhum outro e-mail, e você cancela por qualquer mensagem.
Sem conta: 35 chamadas em 7 dias nas rotas attest, com recibos marcados como teste. Cadastre-se quando quiser seguir adiante.