Für den Produktions-Deploy-Slot anstellen
Fordern Sie einen gehaltenen Lease an, lesen Sie das von der Ebene genannte Back-off und versuchen Sie es erneut, bis der Slot Ihnen gehört.
coordination.lease
Fordern Sie einen gehaltenen Lease an, lesen Sie das von der Ebene genannte Back-off und versuchen Sie es erneut, bis der Slot Ihnen gehört.
coordination.leaseLeiten Sie Agent-Aktionen, Inhalts-Hashes, API-Checks, DNS-Abfragen, Webhooks, LLM-Aufrufe und Git-Commits über Intramedial – für einen signierten Beleg, den jeder prüft, ohne uns zu vertrauen.
Mehrere Agenten wollen den Produktions-Deploy-Slot, und einer hält ihn. Statt in einer engen Schleife abzufragen, wartet jeder so lange, wie die Ebene sagt, und gibt auf, wenn die Wartenden einen Zyklus bilden.
requests, und eine gehaltene RessourceDer Code liest den Schlüssel aus INTRAMEDIAL_KEY. Halten Sie ihn in Ihrer Shell oder Ihrem Secret Store, nie in einer Datei, die Sie committen. Aufrufe, die eine angemeldete Person brauchen, können keinen Schlüssel verwenden: Die Konsole führt sie aus.
Fordern Sie die Ressource an, während ein anderer Agent sie hält. Die Ablehnung nennt den Halter und in stampede.waitMs, wie lange zu warten ist.
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())Schleifen Sie über den Lease-Aufruf und warten Sie zwischen den Versuchen waitMs. Stoppen Sie bei deadlock, das waitingOn nennt.
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[])Geben Sie den Slot frei, sobald das Deployment endet, damit der nächste Agent in der Warteschlange nicht warten muss, bis der Lease von selbst abläuft. Release nimmt Ressource und Agent und optional eine leaseId.
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())Kopiert aus: /docs/coordination-lease
Das Ledger ist Append-only und unter Merkle-Roots versiegelt. Die Zeit eines Eintrags ist Intramedials eigene Uhr, und ein signiertes Bundle lässt sich offline mit dem veröffentlichten Schlüssel prüfen.
Holen Sie mit coordination.lease einen exklusiven Lease auf eine Ressource, sehen Sie, wer ihn hält, und geben Sie ihn frei, wenn Sie fertig sind.
coordination.leaseFühren Sie die sechs festen Intralock-Szenarien aus, lesen Sie das Ergebnis jedes einzelnen und legen Sie einen Rhythmus fest, damit sich der Drill von selbst wiederholt.
drills.frtListen Sie die Detektoren auf, führen Sie lease-overlap aus, lesen Sie die zitierten Konflikte mit ihrem Nachweis und dann die zur Prüfung eingereichten Fälle.
detection.runEine kurze E-Mail, wenn wir neue Rezepte ergänzen. Sonst keine Mail, und Sie melden sich aus jeder Nachricht ab.
Kein Konto nötig: 35 Aufrufe in 7 Tagen auf den Attest-Routen, Belege als Testbelege markiert. Registrieren Sie sich, wenn Sie weitermachen wollen.