RevTurbine SDK — Python
Headless, in-memory entitlement and placement decisioning for Python
services. RevTurbineCustomerSdk (plan 33 TASK-7) decides in-process from a
caller-supplied user context + ExportedConfig snapshot — no network, no
persistence beyond memory. Its decision output is byte-identical to the
canonical TypeScript LocalRuntime (cross-language parity is gate-enforced via
revturbine-sdk-internal/tests/parity/).
Full docs: the published Astro docs site — Getting Started → Python SDK
(source: pages-build/src/content/docs/getting-started/python.mdx).
Install
Published on PyPI as revturbine.
Requires Python ≥ 3.10.
pip install revturbine
Releases are tag-driven and version-locked with @revturbine/sdk — the same
version number always ships for both. (Contributors developing in this repo
use the editable install under Local development
instead. The old GitHub-Release distribution on the now-archived
revt-eng/revturbine-external is retired.)
Quick start
import json
from revturbine import RevTurbineCustomerSdk
with open("playbook.json") as f:
exported_config = json.load(f)
sdk = RevTurbineCustomerSdk(
user_context={"tenant_id": "tenant_abc", "user_id": "user_123", "plan_handle": "pro"},
exported_config=exported_config,
)
if not sdk.check_entitlement("advanced_analytics")["allowed"]:
raise PermissionError("not entitled")
decision = sdk.get_placement_decision(
{"placement_id": "pl_dashboard_upsell", "user_id": "user_123"}
)
Public API
RevTurbineCustomerSdk(*, user_context, exported_config)— keyword-only;user_contextrequirestenant_id+user_id(optionalplan_handle,plan_name,usage). Stateless / in-memory — no storage parameter.check_entitlement(handle, context=None) -> EntitlementCheckResultcan(handle, context=None)— the advertised alias ofcheck_entitlement(same canonical/alias pair as the scaffold SDK function surface and the server-node port)get_placement_decision(input) -> PlacementDecisionget_placement_decisions(inputs) -> list[PlacementDecision]
That is the entire public surface. Browser/full-SDK concerns (React, hooks,
HTTP/dual-mode, decision cache, segment/targeting derivation,
identify/dismiss/snooze/convert/get_trial_status/capture/…) are
intentionally not ported — plan 33 REQ-14 non-goals.
Project layout
server-python/
├── pyproject.toml ← package metadata + tool config (ruff, mypy, pytest)
├── tox.ini ← test/lint/type matrix
├── .pre-commit-config.yaml ← ruff + mypy hooks (scoped to this dir)
├── src/revturbine/ ← the headless SDK (sdk.py + core/ port)
├── revturbine_server/ ← legacy thin-RPC client (see below)
└── tests/ ← pytest suite (incl. tests/test_public_api.py)
Legacy revturbine_server
A historical thin-RPC HTTP client (from revturbine_server import RevTurbineServer) also ships in this package. It is independent of and
unrelated to RevTurbineCustomerSdk — not folded in, not a dual-mode of it.
It currently depends on an unmaintained generated revturbine.types module
(plan REQ-4 / TASK-2) and is not standalone-importable until that
generator lands. Prefer RevTurbineCustomerSdk for all new server
integrations.
Local development
pip install -e ".[dev]"
pytest # unit + smoke + parity-contract tests
mypy # strict type-check of src/ and tests/
ruff check src tests # lint (CI scope)
ruff format --check src tests
tox # full matrix (py310–py313 + lint + type)
Cross-language parity (run from the SDK repo root):
node scripts/run-parity.mjs # TS + Python runners, byte-diff (the gate)
Regenerating vendored types
src/revturbine/types.py is generated from revturbine-scaffold's published
Pydantic models (node scripts/sync-python-types.mjs, run from the SDK repo
root) — never hand-edit it. The generator resolves revturbine-scaffold from
$REVTURBINE_SCAFFOLD_DIR, falling back to the sibling checkout
(../revturbine-scaffold next to the SDK repo root). Inside a .worktrees/
checkout that sibling path resolves to .worktrees/revturbine-scaffold, not
the canonical revt-eng/revturbine-scaffold — set REVTURBINE_SCAFFOLD_DIR
explicitly when running sync:python-types (or the Rust equivalent,
sync:rust-types) from a worktree.
Dependencies
- Runtime:
pydantic>=2.0. - Stdlib only otherwise. The legacy
revturbine_serverclient uses onlyurllib/json/uuid(plus the unmaintained generated-types import noted above).
Metadata
Release files for revturbine 0.11.23
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 | |
|---|---|---|---|---|
| revturbine-0.11.23.tar.gz | 283.0 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| revturbine-0.11.23-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 501.2 kB
Release files / revturbine-0.11.23.tar.gz
| Download URL | revturbine-0.11.23.tar.gz |
|---|---|
| Size | 283.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b1ee2feb559342538e122cc2dd9996af50e6cc10471519e3014dde11b486e722
|
|
BLAKE2b-256 checksum How to use checksums |
641a4d98a1862754655cb9b4db1b839790db26918388f24fbfdec8e3b2abc644
|
| 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 20, 2026.
Transparency logRelease files / revturbine-0.11.23-py3-none-any.whl
| Download URL | revturbine-0.11.23-py3-none-any.whl |
|---|---|
| Size | 218.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
789930bcf2afb2d7b50d0f9e404957109e4f439d8d6ee377aa81dc76129a6537
|
|
BLAKE2b-256 checksum How to use checksums |
d4e7811a8b273ba2eb519e60ded2d210b7b9f7de49adefe841beae63ff14f939
|
| 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 20, 2026.
Transparency logSecurity for revturbine 0.11.23
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for revturbine-0.11.23.tar.gz
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 20, 2026.
Transparency logA 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.