AGNT5 Python SDK
Build reliable AI agents and durable workflows in Python. AGNT5 checkpoints each workflow step, so a run that fails partway resumes from its last completed step instead of starting over. The SDK provides typed functions and workflows, retries, streaming, tool calling, multi-agent handoffs, human-in-the-loop (HITL) approvals, MCP, evals, and runtime observability.
Documentation · Starter templates · Website
Requirements
- Python 3.11 or newer
- An AGNT5 runtime for deployed execution
Installation
pip install agnt5
Quick start
Define a function. Type hints are used to derive its input and output schema.
from agnt5 import FunctionContext, function
@function(retries=3, backoff="exponential")
async def greet(ctx: FunctionContext, name: str) -> dict[str, str]:
ctx.logger.info("greeting user", extra={"name": name})
return {"message": f"Hello, {name}!"}
Register application components with a worker for runtime-backed execution:
import asyncio
from agnt5 import Worker
async def main() -> None:
worker = Worker(service_name="hello-python")
await worker.run()
asyncio.run(main())
Decorated functions, workflows, agents, tools, and scorers are registered when
their modules are imported. See examples/app.py for a
complete application entrypoint.
Invoke a deployed component
from agnt5 import Client
client = Client(
gateway_url="https://gw.agnt5.com",
api_key="agnt5_sk_...",
deployment_id="deployment-id",
)
result = client.run("greet", {"name": "Ada"})
print(result)
Client also supports asynchronous submission, status and result polling,
streaming events, batches, cancellation, workflow resume, chat, and evaluation.
Configuration can be supplied explicitly or through AGNT5_GATEWAY_URL,
AGNT5_API_KEY, and AGNT5_DEPLOYMENT_ID.
Durable steps
Use @step for an operation inside a durable workflow. Its handler starts
after the runtime acknowledges admission, and its result becomes available
after the runtime acknowledges completion. Those two activation calls also
record the step's lifecycle; the SDK adds no separate function checkpoints.
from agnt5 import StepContext, WorkflowContext, step, workflow
@step(retries=3, backoff="exponential", timeout_ms=5000)
async def prepare_search(ctx: StepContext, topic: str) -> dict[str, str]:
return {"query": topic.strip()}
@workflow
async def research(ctx: WorkflowContext, topic: str) -> dict[str, str]:
return await ctx.step(prepare_search, topic, key="search-query")
Register the workflow with a worker; @step handlers are workflow-local and
are not standalone components. Invoke them through ctx.step(...).
Direct calls and execution without durable activation
support raise an error rather than running without durability. A first
parameter named ctx receives a StepContext; it can be omitted when unused.
Sync handlers run in an executor thread.
Use explicit keys for parallel or repeated work. Completed steps replay their
committed result without executing the handler again. Retries reuse the same
activation identity with runtime-owned attempts. External side effects still
need idempotency: ctx.activation.idempotency_key is available to handlers.
Existing @function handlers remain supported with their function checkpoints.
ctx.run(...) is deprecated; replace it with ctx.step(...) using the same
arguments and keys. It remains functional and emits a DeprecationWarning.
Core APIs
| API | Purpose |
|---|---|
@function |
Typed, retryable units of work |
@step |
Workflow-local durable operations with acknowledged admission and completion |
@workflow |
Durable multi-step orchestration and checkpointing |
Agent and @agent |
Model and tool orchestration |
@tool |
Typed tools with generated schemas |
ctx.state |
Durable workflow and component state |
ctx.memory |
Conversation and application memory |
Client / AsyncClient |
Invoke and observe deployed components |
Worker |
Register components and serve runtime dispatch |
Functions called inside workflow steps honor their declared retry and backoff policy. With negotiated durable activations, each attempt is admitted and recorded by the runtime; compatibility execution applies the same attempt budget locally. Completed steps replay their recorded output. Make external side effects idempotent so an interrupted attempt can safely run again.
In async workflows, use await ctx.state.set_async(key, value) and
await ctx.state.delete_async(key). These await the runtime's durable
acknowledgment while allowing other workflows to run. Reads remain local via
ctx.state.get(key). The existing synchronous set and delete methods remain
supported, but block their calling thread while waiting for persistence.
The shared Rust runtime foundation lives in
agnt5dev/sdk-core. Vendor sandbox
adapters live in
agnt5dev/sdk-integrations.
Event triggers
Use event(...) or webhook(...) in a workflow's triggers declarations.
Filtering, input mapping, batching, and delays are not supported yet. Leave
filter_expression, input_mapping, batch_window_ms, and delay_expression
unset; workflow registration rejects nonempty expressions and nonzero batch
windows with an error naming the option.
Examples and documentation
examples/contains functions, workflows, agents, tools, streaming, HITL, MCP, chat, and evaluation examples.docs/contains SDK-specific guides.- AGNT5 documentation covers platform concepts and deployment.
Response wait
Run and stream calls wait up to 5 minutes by default. Set the per-call wait to any value from zero to 24 hours. Zero returns a pending receipt immediately after acceptance. This controls response waiting, not the workflow execution deadline: accepted work continues when the wait expires or the client disconnects.
result = client.run("process_order", order, component_type="workflow", wait_timeout=60)
for event in client.stream_events("process_order", order, component_type="workflow", wait_timeout=60):
print(event.event_type, event.run_id)
wait_timeout uses seconds and also applies to async run and stream_events.
Run calls return 202 pending receipts directly, without additional polling.
Event streams emit stream.wait_expired when the wait expires, or
stream.detached for a 202 receipt. Use the run ID to read status/results.
Chunk-only stream raises RunError with the run ID when waiting ends.
The default HTTP timeout allows at least the wait plus 10 seconds, or the client
timeout if longer. Pass timeout=75 to set it explicitly. Python's HTTP timeout
limits individual network operations; wait_timeout bounds the gateway wait.
Structured assertions
structured_assertions is a reserved built-in scorer, so workers need no user
registration. The local helper uses the same SDK-core implementation as the runtime:
from agnt5.eval import ScorerInput, structured_assertions
result = structured_assertions(
ScorerInput(output=[1, 2, 3], expected={"expected_length": 3}),
{"assertions": [
{"name": "unique_ids", "expr": "unique(output_json)"},
{"name": "count", "expr": "size(output_json) == expected.expected_length"},
]},
)
The score is the fraction of assertions that pass; score_threshold defaults to
- Configuration and input errors always fail. See the SDK-core contract for supported expressions and execution limits. Requires the matching native extension.
Serverless signing
Pass signing_secret to agnt5.serverless.serve() or ServerlessApp. It can be a
string or a resolver that reads your provider's environment. Invokes with no
resolved secret return HTTP 503 (WORKERLESS_SIGNING_SECRET_REQUIRED) before
running user code. Missing or invalid signatures with a configured secret return
401. The manifest remains available for discovery.
For local development only, serve(allow_unsigned=True) permits unsigned invokes
when no secret resolves and logs a warning at startup. It still verifies requests
when a secret is configured. Missing static secrets warn at startup; an empty
request-time resolver warns on its first failed invoke. AGNT5 activation and
dispatch still require a signing secret, regardless of this SDK option.
Development
uv sync --all-groups
uv run ruff check src tests
uv run pytest tests/unit -q
uv build --sdist
Development builds use a sibling checkout of
sdk-core.
Contributing
See CONTRIBUTING.md. Report security issues according to SECURITY.md.
License
Licensed under the Apache License 2.0.
Declared steps keep managed waits such as ctx.sleep() and ctx.wait_for_user() at workflow boundaries. Call them between steps. For a timed-out synchronous handler, failure and retries wait until its executor thread exits; a timeout cannot stop a Python thread.
Metadata
Release files for agnt5 0.15.1
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 | Actions |
|---|---|---|---|---|
| agnt5-0.15.1.tar.gz | 978.8 kB | Without provenance | Details for agnt5-0.15.1.tar.gz |
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| agnt5-0.15.1-cp310-abi3-manylinux_2_28_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ x86-64 | Details for agnt5-0.15.1-cp310-abi3-manylinux_2_28_x86_64.whl |
| agnt5-0.15.1-cp310-abi3-manylinux_2_28_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ ARM64 | Details for agnt5-0.15.1-cp310-abi3-manylinux_2_28_aarch64.whl |
| agnt5-0.15.1-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details for agnt5-0.15.1-cp310-abi3-macosx_11_0_arm64.whl |
Total release size: 56.0 MB
Release files / agnt5-0.15.1.tar.gz
| Download URL | agnt5-0.15.1.tar.gz |
|---|---|
| Size | 978.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3d023ded5cd1ca3b74a4106ef11f68c56084db3254c77deba83d8149da5de755
|
|
BLAKE2b-256 checksum How to use checksums |
e1e20a2a932dfc538461ed2cdd9b1a0ae541e284492978c15e1f453bdc5afaaf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / agnt5-0.15.1-cp310-abi3-manylinux_2_28_x86_64.whl
| Download URL | agnt5-0.15.1-cp310-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 18.6 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
a8b70be263168c72e45ee5c7429c177c8bbadc106be17e283bfb9bba5ca2da14
|
|
BLAKE2b-256 checksum How to use checksums |
e245f0fc4ec84a439ba6dcca7b6baa53b8ce294e09f7ae23c1e115135ebc5f29
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / agnt5-0.15.1-cp310-abi3-manylinux_2_28_aarch64.whl
| Download URL | agnt5-0.15.1-cp310-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 19.6 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
a4e5d032c87fcf784c903fa6bee2a0166a2e7519a4c28a3f850daaf7d05bcdf7
|
|
BLAKE2b-256 checksum How to use checksums |
11c2899e8ae16f8e73e4152c40a6037a2e066cb29cc7d30b5b183b5ad3fdd4bc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / agnt5-0.15.1-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | agnt5-0.15.1-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 16.8 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5b24b65ba2b05ff2c9d478ad06b296c74bfd6b237aebd027dc4d2874c76e88a7
|
|
BLAKE2b-256 checksum How to use checksums |
969b88f2d538db2e1172552801b8cfbcb82e65af5e0c0a38d68356d94dddfa09
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Security for agnt5 0.15.1
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.