Skip to main content

Coordination layer for AI scheduling agents — race-free multi-agent booking with priority ranking and an audit log.

Project description

agentdraft — Python SDK

PyPI Python License: MIT

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.

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. Carries winning_booking_id, winning_agent_id, winning_agent_priority, your_priority, and reason. The winning booking's audit_event_id is available on the returned Booking model for the agent that did win.
  • AuthError — bad / missing / expired API key.
  • RateLimited — token bucket exhausted. Has retry_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

Security

Found a vulnerability? See https://agentdraft.io/securitydo not open a public issue for a security report.

License

MIT — see https://agentdraft.io/legal/license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

agentdraft-0.1.1.tar.gz (11.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agentdraft-0.1.1-py3-none-any.whl (10.5 kB view details)

Uploaded Python 3

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

Hashes for agentdraft-0.1.1.tar.gz
Algorithm Hash digest
SHA256 92ee1b7ea8d7d31f2b8390b9b4848d27c24bf76661a7a2fc9aceb30993b5d2fe
MD5 34cfdbbfb5cb861978900ae472d60738
BLAKE2b-256 32df32c7d770de360fb077ff62f268a50372c185d72c8ef6292e82366ee320ad

See more details on using hashes here.

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

Hashes for agentdraft-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 845d568589e43e30505cd4e9955c1c6b0c3a80206457c391871f27d0c2571a8d
MD5 f4ecb1aaea35e9703e48f4c244aaa730
BLAKE2b-256 bdab6feb9108e4e4fb00ffac4a0b702675a8ee97648f754df246334ff5bf3867

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page