llmfleet
Fleet-level batch dispatcher for LLM APIs. Pool requests from many coroutines, route to provider Batch APIs (50% discount on Anthropic, OpenAI), keep your sync agent loops working.
pip install llmfleet
Why
Anthropic's Batch API saves 50% on input tokens, but it's terrible for one agent — single requests poll for 90–120s. The right unit of batching isn't one user's turn; it's a fleet of agents' turns pooled together by a layer the user never sees. llmfleet is that layer.
Quick start
import asyncio
from anthropic import AsyncAnthropic
from llmfleet import FleetDispatcher, RoutingPolicy
async def main():
client = AsyncAnthropic()
policy = RoutingPolicy(
sync_max_latency_ms=5_000, # interactive paths stay sync
batch_window_ms=30_000, # otherwise pool for 30s
batch_min_size=10,
batch_max_size=100,
)
async with FleetDispatcher(client, policy=policy) as fleet:
# Tight latency → sync
chat = await fleet.submit(
latency_budget_ms=2_000,
model="claude-sonnet-4-20250514",
max_tokens=200,
messages=[{"role": "user", "content": "Hi"}],
)
# Loose latency → pooled into a batch
graded = await asyncio.gather(*[
fleet.submit(
latency_budget_ms=600_000,
model="claude-sonnet-4-20250514",
max_tokens=200,
messages=[{"role": "user", "content": f"Grade: {essay}"}],
)
for essay in essays
])
asyncio.run(main())
How it works
FleetDispatcher runs a background flusher coroutine. Calls to submit() either:
- Run synchronously if
latency_budget_ms <= policy.sync_max_latency_ms, or - Get queued. When the queue holds
batch_min_sizeitems orbatch_window_mselapses, the flusher submits one Anthropic Message Batch, polls until completion, and dispatches results back to each awaiting coroutine via its Future.
Concurrent submit() calls from independent coroutines automatically share batches.
API
FleetDispatcher(client, policy=None, on_batch_submitted=None)
# Lifecycle: use as async context manager
async with FleetDispatcher(client) as fleet:
response = await fleet.submit(latency_budget_ms=N, **anthropic_messages_create_kwargs)
# Force routing decisions
await fleet.submit_sync(**kwargs)
await fleet.submit_batch(**kwargs)
# Introspection
fleet.stats.sync_calls
fleet.stats.batched_calls
fleet.stats.batches_submitted
Configuration
RoutingPolicy(
sync_max_latency_ms=5_000, # threshold for sync routing
batch_window_ms=30_000, # how long to wait for a batch to fill
batch_min_size=1, # minimum size before flushing early
batch_max_size=100, # hard cap (Anthropic supports up to 10k)
poll_interval_s=2.0, # batch status poll interval
)
What it doesn't do
- Not a router across providers/models for quality. Use a real router.
- Not cross-process pooling — fleet is process-local. Use a shared queue (Redis / SQS) for cross-process.
- Doesn't try to batch tool-call turns where the tool is on the critical path; pass
force_sync=Truefor those.
Status
v0.1.0: Anthropic only. OpenAI Batch API and Bedrock async-invoke are on the roadmap. Patches welcome.
License
MIT
Metadata
Release files for llmfleet 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| llmfleet-0.1.0.tar.gz | 7.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| llmfleet-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 15.0 kB
Release files / llmfleet-0.1.0.tar.gz
| Download URL | llmfleet-0.1.0.tar.gz |
|---|---|
| Size | 7.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dce0daeaf67b76c549c91644565dc1e760db6564c72c8a64ecc879e72d9777ac
|
|
BLAKE2b-256 checksum How to use checksums |
fc210d6f913a12a905ebd8846b6a2ffb3cb93d9574c106cc2c61647e105ccc36
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|
Release files / llmfleet-0.1.0-py3-none-any.whl
| Download URL | llmfleet-0.1.0-py3-none-any.whl |
|---|---|
| Size | 7.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1760c4d285caf410af5672543ea7504e8a0555633ab7f6fefb0e0804ac94a395
|
|
BLAKE2b-256 checksum How to use checksums |
c5c8a0b9eafe6dc56c9e083ca7a0cf7d085efefd2c5bc5217a9aeed10241ae5b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|
Security for llmfleet 0.1.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.