Haz cola para el turno de despliegue en producción
Pide una concesión tomada, lee la espera que indica el plano y reintenta hasta que el turno sea tuyo.
coordination.lease
Pide una concesión tomada, lee la espera que indica el plano y reintenta hasta que el turno sea tuyo.
coordination.leasePasa por Intramedial acciones de agentes, hashes de contenido, pruebas de API, DNS, webhooks, llamadas LLM y commits. Obtén un recibo firmado que cualquiera verifica, sin fiarse de nadie.
Varios agentes quieren el turno de despliegue en producción y uno lo tiene. En lugar de sondear en un bucle ajustado, cada uno espera el tiempo que indica el plano y se rinde si los que esperan forman un ciclo.
requests, y un recurso tomadoEl código lee la clave de INTRAMEDIAL_KEY. Guárdala en tu shell o en tu almacén de secretos, nunca en un archivo que suba al repositorio. Las llamadas que requieren una persona con sesión iniciada no pueden usar una clave: las hace la consola.
Pide el recurso mientras otro agente lo tiene. El rechazo nombra al titular y, en stampede.waitMs, cuánto esperar.
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: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",
}),
});
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:cost",
},
timeout=30,
)
print(res.status_code, res.json())Haz un bucle sobre la llamada de concesión y duerme waitMs entre intentos. Detente ante deadlock, que nombra waitingOn.
const API = "https://api.intramedial.com/api/v1/acp";
const headers = {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
};
const ask = { resource: "lock:deploy/production", actorDid: "did:web:acme.example:agent:cost" };
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
let lease = null;
for (let attempt = 0; attempt < 20 && !lease; attempt++) {
const res = await fetch(`${API}/coordination/lease`, { method: "POST", headers, body: JSON.stringify(ask) });
const body = await res.json();
if (body.ok) lease = body.lease;
else if (body.reason === "deadlock") throw new Error("wait cycle, waiting on " + body.waitingOn);
else await sleep(body.stampede?.waitMs ?? 1000); // the plane names the back-off
}
if (!lease) throw new Error("no slot yet");
console.log("holding", lease.id, "until", new Date(lease.expiresAtMs).toISOString());import os, time, requests
API = "https://api.intramedial.com/api/v1/acp"
headers = {"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]}
ask = {"resource": "lock:deploy/production", "actorDid": "did:web:acme.example:agent:cost"}
lease = None
for _ in range(20):
body = requests.post(f"{API}/coordination/lease", headers=headers, json=ask, timeout=30).json()
if body.get("ok"):
lease = body["lease"]
break
if body.get("reason") == "deadlock":
raise SystemExit(f"wait cycle, waiting on {body.get('waitingOn')}")
time.sleep(body.get("stampede", {}).get("waitMs", 1000) / 1000) # the plane names the back-off
if not lease:
raise SystemExit("no slot yet")
print("holding", lease["id"], "until", lease[])Suelta el turno en cuanto termine el despliegue, para que el siguiente agente de la cola no espere a que la concesión caduque sola. Release recibe el recurso y el agente, y un leaseId opcional.
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:cost"
}'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:cost",
}),
});
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:cost",
},
timeout=30,
)
print(res.status_code, res.json())Copiado de: /docs/coordination-lease
El libro mayor es de solo anexado y está sellado bajo raíces de Merkle. La hora de una entrada es el reloj propio de Intramedial, y un paquete firmado puede verificarse sin conexión con la clave publicada.
Toma una concesión exclusiva sobre un recurso con coordination.lease, mira quién la tiene y suéltala cuando termine.
coordination.leaseEjecuta los seis escenarios fijos de Intralock, lee el resultado de cada uno y fija una cadencia para que el simulacro se repita solo.
drills.frtEnumera los detectores, ejecuta lease-overlap y lee los conflictos que cita con su evidencia; luego lee los casos que presentó para revisión.
detection.runUn email breve cuando añadimos recetas. Ningún otro correo, y puedes darte de baja desde cualquier mensaje.
Sin cuenta: 35 llamadas en 7 días en las rutas attest, con recibos marcados como de prueba. Regístrate cuando quieras seguir.