Skip to main content

Donkey Development Kit (DDK)

donkey-kit on PyPI

Donkey Development Kit

An SDK for consuming Agent Fabric capabilities — governed model and tool access — from your own agent framework, in your own IDE, without adopting Mule.

Project status — alpha. This is an early release (Development Status :: 3 - Alpha). The LLM data plane is live-verified; most other surfaces are verification-gated (see What's verified below). Install it from PyPI with pip install donkey-kit — see Install. Unofficial: an independent project, not affiliated with or endorsed by Salesforce or MuleSoft.

Support & trademark statement (please read)

"Agent Fabric" is a MuleSoft (Salesforce) product name, not a generic term. MuleSoft, Anypoint, Omni Gateway, and Agent Fabric are Salesforce trademarks.

Maintainer & support. This is an independent, community-maintained project, published under the org-scoped Donkey-Development-Kit name — it is not affiliated with, endorsed by, or supported by Salesforce or MuleSoft. It is provided as-is, without warranty of any kind; the maintainers triage issues and pull requests on a best-effort basis, with no SLA. Because it ships under a distinct, org-scoped name, only the descriptive form ("an SDK for MuleSoft Agent Fabric") appears in prose — the package does not represent itself as a first-party, official-status SDK.

Licensed under Apache-2.0. See the unsupported boundary for exactly which platform APIs this SDK calls and their support classification.

Security. Report vulnerabilities privately, never in a public issue. See SECURITY.md for supported versions and how to report.

Python versions. CPython 3.10–3.14, each tested in CI; a version is dropped in the first minor release after its end of life. See docs/python-support.md.

Contents

Documentation

Two audiences, two doc sets:

  • Use the SDK → the documentation site: https://docs.donkey-kit.dev/. Install and configure, per-framework model access, the governed error taxonomy, and what to trust today — everything you need to point your agent at a governed proxy.
  • See it run → runnable demos live in the companion repo donkey-development-kit-demos: the framework-free client, native framework objects, the governed error taxonomy, and the screen-recording scripts.
  • Understand or contribute to the repo:
    • ARCHITECTURE.md — how the SDK is built: the layered stack, the framework-free core, verification discipline, the error taxonomy, and framework tiering.
    • CONTRIBUTING.md — how to work in the repo: the branch/PR/release workflow, the testing strategy, coding conventions, and the docs-sync rule.
    • docs/verified-apis.md — the verification ledger: the single source of truth for what is confirmed against a real sandbox and what is still blocked.

Install

pip install "donkey-kit[llm,langgraph]"   # base + raw client + one framework

To work on the SDK itself, install from source with the contributor tooling (the dev dependency group needs pip 25.1 or later):

git clone https://github.com/Donkey-Development-Kit/donkey-development-kit.git
cd donkey-development-kit/python
pip install -e ".[llm,cli]" --group dev

Extras are one per framework (langgraph, adk, strands, agent_framework, openai-agents, anthropic, crewai, llamaindex) plus otel, cli, local, test (the conformance pytest plugin — pytest --donkey-conformance --donkey-agent=my_app.agent:build), and all. all is everything a user runs that installs together — llm, langgraph, otel, cli, local — with no test runner, so add test for the conformance plugin: donkey-kit[all,test]. It leaves out the seven other framework extras, because whether they install together depends on their upstream releases. The generated co-installability table shows which combinations resolve, re-checked nightly. Add the one framework you use: donkey-kit[all,crewai]. Configuration and first-agent walkthroughs live on the documentation site.

Framework support

The roster is deliberately one deep, seven shallow (BG §1.8): one adapter held to the full conformance bar, the rest supported through the three-line connection_kwargs() escape hatch. Every framework below returns its framework's own native object — never a wrapper.

Each factory's status is its constructor row in the docs/verified-apis.md §8; its depth is the adapter roster's conformance_tested.

Framework Factory Depth Ledger status
LangGraph donkey.langgraph.chat_model() Conformance-tested Live-verified
Google ADK donkey.adk.model() connection_kwargs() Live-verified
Google ADK donkey.adk.gemini() connection_kwargs() Live-verified
Strands donkey.strands.model() connection_kwargs() Live-verified
MS Agent Framework donkey.agent_framework.chat_client() connection_kwargs() Live-verified
OpenAI Agents SDK donkey.openai_agents.model() connection_kwargs() Live-verified
Anthropic SDK donkey.anthropic.client() connection_kwargs() Live-verified
CrewAI donkey.crewai.llm() connection_kwargs() Live-verified
LlamaIndex donkey.llamaindex.llm() connection_kwargs() Live-verified

Signature-confirmed means the factory builds its native object against the installed framework (scripts/verify_frameworks.py), with no live round-trip. Live-verified means a real round-trip through a governed proxy. The raw client (donkey.llm.client()) is conformance-tested too.

connection_kwargs() works for all eight; a second deep adapter is promoted from demand evidence, one at a time (#223/#244) — never guessed up front. See the framework pages for each. Which framework versions are supported and tested is on the site's version compatibility page and in docs/framework-support.md.

What's verified (verification discipline)

The LLM data plane — governed model access through the Omni Gateway proxy — is live-verified against a real Anypoint sandbox. The framework-free client and the framework adapters are wired to that contract; the raw client is conformance-tested against the simulator. For the adapters (each factory is listed under Framework support):

LangGraph is conformance-tested against the simulator in CI. Each adapter factory's constructor row in §8 of the ledger reads live-verified.

Everything still gated raises NotImplementedError("blocked on verification: …") rather than guessing at an unverified endpoint, header, or class name — that currently includes Exchange→MCP tool discovery and Exchange publication; their types live in donkey_kit.experimental, outside the stable namespace. The SDK does not ship a provisioning control plane (ADR 0008 in docs/adr/). The adapters build their framework's native object directly; they refuse only when the installed framework version lacks the class or field the adapter depends on.

The discipline behind this is documented in ARCHITECTURE.md → Verification discipline; the row-by-row worklist is docs/verified-apis.md.

Conformance exemptions

The conformance plugin holds the SDK to the same bar it asks of your agent. Where a framework legitimately cannot satisfy a scenario, the reason is asserted in code (KNOWN_LIMITATIONS) and published here as credibility — never a silent skip (the conformance kit):

Framework Scenario Why it's exempt
CrewAI correlation ID propagated CrewAI's native OpenAI provider builds both its sync OpenAI and its AsyncOpenAI from one client_params dict, and with an interceptor set it replaces http_client with its own httpx client, so the SDK's async client cannot be injected and the correlation ID ends up per-client, not per-run. ADK (model() and gemini()), LlamaIndex and Microsoft Agent Framework send through the SDK's shared client and record no exemption (#691, #740).
CrewAI gateway identity observed For the same reason, no response reaches the SDK's _on_response hook. When every resolved adapter is non-observing, donkey.last_call reports UNAVAILABLE and names them in surface.
CrewAI JWT refreshed per send CrewAI's native OpenAI provider owns the transport and builds its own clients, so the rotating JWT the SDK adds per send never reaches its requests. donkey.crewai.llm() and connection_kwargs() raise ConfigError in jwt mode; use client-id auth with CrewAI. ADK's model() and gemini(), LlamaIndex and Microsoft Agent Framework send through the SDK's client and carry the rotating JWT on async calls (jwt mode).
CrewAI budget refusal not retried CrewAI wraps every LLM call in its own rate-limit retry (3 attempts) and treats any 429 as a rate limit, so a TokenBudgetExceeded or RequestRateLimitExceeded refusal is sent 3 times. CrewAI has no setting to turn it off; the OpenAI client underneath has max_retries=0. Every other adapter sends a budget refusal once (#734).
CrewAI typed refusal bridged CrewAI's native OpenAI provider owns the transport, so its errors come from a client the SDK never saw, and donkey.run() and typed_refusals() cannot tell a gateway refusal from any other failure there and pass those errors through (#724). ADK's gemini() and model() send through the SDK's transport and are bridged (conformance-tested in #955 and #969). LiteLLM, under model(), re-raises a refusal as its own exception, and the adapter's llm_client marks that exception with the refusal the SDK's transport received.

Each exemption matches what the adapter reports in donkey.<framework>.capabilities() (a frozen AdapterCapabilities per factory), and a unit test keeps the two in step (#726).

Metadata

Release files for donkey-kit 0.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for donkey-kit 0.1.3
File Size Uploaded
donkey_kit-0.1.3.tar.gz 773.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for donkey-kit 0.1.3
File Interpreter ABI Platform
donkey_kit-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 1.1 MB

Release files / donkey_kit-0.1.3.tar.gz

Download URL donkey_kit-0.1.3.tar.gz
Size 773.6 kB
Tags Source
SHA-256 checksum
How to use checksums
5f40757f7ac2d4739d36c59020a25a660a75ce704e0707235d7b685976113cc8
BLAKE2b-256 checksum
How to use checksums
8979d749cf65f1e198944be32a68b7d58b556c099ea5fd00ea335cc39623c732
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.

Transparency log

Release files / donkey_kit-0.1.3-py3-none-any.whl

Download URL donkey_kit-0.1.3-py3-none-any.whl
Size 325.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
68d1f4bb792081ec98f3b67f107e4b59a5a2c1fd74f7518e2a2696bd8385c792
BLAKE2b-256 checksum
How to use checksums
9ea146450b6cb4bcc8480788f3537d40c29dbab33c52c7f29290e933ba670a80
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page