Coordination layer for AI scheduling agents — race-free multi-agent booking with priority ranking and an audit log.
Project description
agentdraft — Python SDK
AgentDraft is the coordination layer for AI scheduling agents. When two or more agents — your sales bot, a Cal.com handler, an internal recruiter, a Claude/OpenAI assistant — write to the same calendar, AgentDraft is the one API that decides who wins, atomically, with a tamper-evident audit row for every commit.
This is the official Python SDK. It gives an agent a typed, one-line surface to participate.
- Protocol spec: https://agentdraft.io/spec
- Why it exists: https://agentdraft.io/why
- Live API reference: https://agentdraft.io/docs
Install
pip install agentdraft
Requires Python 3.9+.
Quickstart
from datetime import datetime, timedelta, timezone
from agentdraft import Client, Conflict
client = Client(api_key="avs_live_...") # or set AGENTDRAFT_API_KEY
start = datetime.now(timezone.utc) + timedelta(hours=4)
end = start + timedelta(minutes=30)
try:
booking = client.bookings.commit(
start=start, end=end,
idempotency_key="ik_call_42",
metadata={"title": "Discovery call"},
)
print("booked:", booking.booking_id)
except Conflict as e:
print(f"outranked by {e.winning_agent_id} (rank {e.winning_agent_priority})")
A losing agent gets a typed Conflict exception, not a timeout — it
knows who won, by what priority, and where the audit row lives, so
fallback behavior (propose an alternate, escalate, defer) is a clean
except clause away.
Why a separate API?
Coordinator frameworks (LangChain, LangGraph, CrewAI, AutoGen, Composio,
the OpenAI Agents SDK) coordinate work between agents — sequential,
parallel, or graph orchestration of LLM calls and tools. None of them
solve write contention on the calendar itself: two agents firing
POST /events against Google Calendar at the same moment will both
succeed, and you have a double-booking.
AgentDraft solves only that problem, and solves it once. Every agent
the calendar owner runs calls bookings.commit(...) against AgentDraft
before touching the real calendar. The conflict engine uses
time-bucketed conditional writes in DynamoDB inside a single
TransactWriteItems — atomic, race-free, no locks. The user ranks
their agents in the dashboard; ties go to the higher-rank agent;
recent commits can be evicted by higher-priority agents inside a
configurable bump window.
See the race
The repo ships a multi-agent race demo. With the local stack up:
git clone https://github.com/GipsyChef/agentdraft && cd agentdraft
docker compose up -d dynamodb
pip install -e ".[dev]" -e sdks/python
uvicorn app.main:app --port 8080 &
python scripts/demo_race.py # 5 agents, ranked priorities, one slot
Five agents fire concurrently at the same target slot. The highest-rank
agent wins; the rest get 409 outranked with the winner's identity for
graceful fallback. The demo prints per-agent latency, the winning
booking id, and a link to the audit trail of the whole race.
Authentication
API keys are issued from the AgentDraft dashboard and start with
avs_live_. Pass it explicitly or let the client read it from the
environment:
Client(api_key="avs_live_...")
# or
import os; os.environ["AGENTDRAFT_API_KEY"] = "avs_live_..."
Client()
For local development against a dev backend, point at it via
AGENTDRAFT_BASE_URL or the base_url= kwarg.
Surface
| Attribute | Purpose |
|---|---|
client.availability |
Read merged availability across all agents writing to the calendar |
client.bookings |
hold, release, commit, cancel — the four state transitions |
client.agents |
me() — confirm key + current priority + scopes |
client.mailbox |
Inbound/outbound mail surface for agents that book via email |
All blocking I/O. An async client is on the roadmap; for now wrap with
asyncio.to_thread if you need concurrency.
Error types
Every failure is a typed exception so callers can branch precisely:
Conflict— your write was outranked. Carrieswinning_booking_id,winning_agent_id,winning_agent_priority,your_priority, andreason. The winning booking'saudit_event_idis available on the returnedBookingmodel for the agent that did win.AuthError— bad / missing / expired API key.RateLimited— token bucket exhausted. Hasretry_after(seconds).RuleViolation— request was syntactically valid but violated a rule (focus block, daily cap, business hours).AgentDraftError— base class; catch this if you only need a catch-all.
Idempotency
Pass idempotency_key= to bookings.commit(...). The server caches the
result by (agent_id, key) for 24 hours, so a retry over a flaky network
returns the original booking, not a duplicate.
Use with LangChain / CrewAI / AutoGen
The SDK is framework-agnostic — wrap any method in a Tool and pass it
to your agent. A first-party agentdraft-langchain package with ready
BookingTool / AvailabilityTool / ConflictAwareBookingTool
wrappers is on the roadmap.
Links
- Protocol spec: https://agentdraft.io/spec
- API docs: https://agentdraft.io/docs
- Changelog: https://agentdraft.io/changelog
- Source & issues: https://github.com/GipsyChef/agentdraft
- TypeScript SDK:
@agentdraft/sdk
Security
Found a vulnerability? See https://agentdraft.io/security — do not open a public issue for a security report.
License
MIT — see https://agentdraft.io/legal/license.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agentdraft-0.1.1.tar.gz.
File metadata
- Download URL: agentdraft-0.1.1.tar.gz
- Upload date:
- Size: 11.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
92ee1b7ea8d7d31f2b8390b9b4848d27c24bf76661a7a2fc9aceb30993b5d2fe
|
|
| MD5 |
34cfdbbfb5cb861978900ae472d60738
|
|
| BLAKE2b-256 |
32df32c7d770de360fb077ff62f268a50372c185d72c8ef6292e82366ee320ad
|
File details
Details for the file agentdraft-0.1.1-py3-none-any.whl.
File metadata
- Download URL: agentdraft-0.1.1-py3-none-any.whl
- Upload date:
- Size: 10.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
845d568589e43e30505cd4e9955c1c6b0c3a80206457c391871f27d0c2571a8d
|
|
| MD5 |
f4ecb1aaea35e9703e48f4c244aaa730
|
|
| BLAKE2b-256 |
bdab6feb9108e4e4fb00ffac4a0b702675a8ee97648f754df246334ff5bf3867
|