This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
Consider using release 0.4.21 instead.
Reason given by maintainers: Crashes on all invocations; fixed in 0.4.21 (CLEANLIB-629)
cleanlib-sdk
CleanLibrary Python SDK — asyncio + httpx; mirrors the Rust
cleanlib-client HTTP surface and the JavaScript @cleanstart/cleanlib-sdk
sister-shape.
Status: v0.4.7 — production-ready.
Install
pip install cleanlib-sdk
Requires Python 3.10+. Depends on httpx>=0.27 and pydantic>=2.
Overview — per-domain client triad (v0.4.2+)
v0.4.2 split the SDK into three per-domain HTTP clients, each pointed at
its own CleanLibrary surface:
| Client | Endpoint (default) | Purpose |
|---|---|---|
HttpVerdictClient |
https://cleanapp.clnstrt.dev |
App customer-verdict surface — fetch_verdict / scan / audit / policy_preview / risk_accept |
HttpRemediationClient |
DEFAULT_REMEDIATION_BASE_URL (https://cleanlib-enrich.clnstrt.dev) |
Sparse 7-block /remediation responses |
HttpEnrichClient |
DEFAULT_ENRICH_BASE_URL (https://cleanlib-enrich.clnstrt.dev) |
8-verb cleanlib-enrich cascade — get_exploitability / get_exploitability_bulk / get_epss / get_kev / get_advisories / get_enrich / get_library_verdict / bulk_packages_check |
The legacy Client (flat-method) still ships for source-compat with
v0.4.0 callers and emits DeprecationWarning on __init__; scheduled
removal in v1.0.0. New integrations should use the per-domain triad.
Usage — verdict client
import asyncio
from cleanlib_sdk import HttpVerdictClient, PolicyDenyError, RiskAcceptanceRequiredError
async def main() -> None:
async with HttpVerdictClient(
base_url="https://cleanapp.clnstrt.dev",
api_key="clk_std_...", # opaque CleanLibrary access key
) as c:
try:
v = await c.fetch_verdict("npm", "lodash", "4.17.21")
print(f"{v.decision} composite_score={v.composite_score}")
print(f"reasoning: {v.reasoning}")
except PolicyDenyError as e:
print(f"DENIED [{e.reason_code}]: {e.message}")
except RiskAcceptanceRequiredError as e:
print(f"RISK ACCEPT REQUIRED: {e.message}")
if e.docs_url:
print(f"see: {e.docs_url}")
asyncio.run(main())
Usage — enrich cascade
import asyncio
from cleanlib_sdk import (
HttpEnrichClient,
epss_found, kev_found,
EXPLOITABILITY_BULK_CAP,
)
async def main() -> None:
async with HttpEnrichClient(api_key="clk_std_...") as e:
# KEV / EPSS return a discriminated union — one of *_found / *_not_found.
kev = await e.get_kev("CVE-2021-44228")
if kev_found(kev):
print(f"KEV listed: due_date={kev.due_date}")
epss = await e.get_epss("CVE-2021-44228")
if epss_found(epss):
print(f"EPSS score={epss.score} percentile={epss.percentile}")
# Bulk: server caps at EXPLOITABILITY_BULK_CAP (100) per request.
exp = await e.get_exploitability_bulk([
"CVE-2021-44228", "CVE-2022-22965", "CVE-2023-4863",
])
for cve in exp.results:
print(cve.cve_id, cve.availability)
asyncio.run(main())
Usage — remediation
import asyncio
from cleanlib_sdk import HttpRemediationClient
async def main() -> None:
async with HttpRemediationClient(api_key="clk_std_...") as r:
rem = await r.get_remediation("npm", "lodash", "4.17.15")
# Sparse 7-block: any block may be absent (RemediationOrAbsent).
if rem.recommended_version is not None:
print(f"upgrade to {rem.recommended_version.version}")
asyncio.run(main())
Public API surface
Everything below is exported from the top-level cleanlib_sdk package
and covered by __all__ (verified against dir(cleanlib_sdk) at
release-cut per CLEANLIB-83). New symbols are grouped by the version
they were introduced in.
v0.4.7 — Verdict.decision auto-derived
Verdict.decisionis now auto-derived at the type layer (CLEANLIB-294) — consumers no longer need to re-runderive_statuson a rawVerdict; the field is populated from the envelope substance + freshness precedence at parse time.
v0.4.6 — envelope emit
verdict_to_envelope_v1(verdict) -> dict— canonical Verdict→envelope packer per CLEANLIB-48. Sister-shape of the sdk-js emitter; the fixture-driven contract test intests/verdict_to_envelope_contract.pykeeps both SDKs byte-identical.
v0.4.5 — previous-verdict parity
PreviousVerdict— envelope carries the prior verdict when a re-scan changes the decision; enables audit-log diff view.
v0.4.4 — customer-state taxonomy (CLEANLIB-178)
CustomerState— enum mirroringcleanlib-client/src/customer_state.rs.Tier— customer tier enum (FREE/STD/PRO/ …).ALL_VERDICT_SOURCES— canonical registry of verdict-source strings (used by cross-SDK contract test to guard against silent drift).
v0.4.3 — brand/metadata sanitize
Pyproject brand cleanup; no new symbols.
v0.4.2 — enrich cascade + F4 default-flip
Clients:
HttpVerdictClient— App customer-verdict surface (completes the triad; the v0.4.1 split shipped remediation + enrich).HttpEnrichClient— 8-verb cleanlib-enrich cascade; defensive wrappers (advisories double-parse + dedup;cve_id ↔ cveIdnormalization; sparse-by-design tolerance).
Constants:
DEFAULT_ENRICH_BASE_URL—https://cleanlib-enrich.clnstrt.dev.DEFAULT_REMEDIATION_BASE_URL— F4-flipped tohttps://cleanlib-enrich.clnstrt.dev(was the vva URL in v0.4.1). Consumers passing an explicitbase_url=are unaffected.EXPLOITABILITY_BULK_CAP— server-side cap onget_exploitability_bulkbatch size.REMEDIATION_CACHE_TTL_SECS— default TTL used by the remediation client's in-process cache.
Enrich wire-shapes:
AdvisoryRow,AdvisorySeverity— advisories.AvailabilityFlag,ExploitabilityAvailability,ExploitabilityResponse— exploitability triage.EpssResponse,EpssOrNotFound,epss_found,epss_not_found— EPSS with found/not-found discriminated union + helpers.KevResponse,KevOrNotFound,kev_found,kev_not_found— KEV with found/not-found discriminated union + helpers.EnrichResponse,LibraryVerdictResponse— top-level cascade responses.BulkPackageRef,BulkPackageResult,BulkPackagesCheckResponse—bulk_packages_checkrequest/response shapes.
v0.4.1 — contract enforcement + remediation client
HttpRemediationClient— sparse 7-block/remediationresponses.RemediationBlock,RemediationResponse,RemediationOrAbsent— remediation wire-shapes.ReasonCode— 15-entry canonical registry (Enum).ALL_REASON_CODES— read-only tuple of every registered reason code.VERDICT_ENVELOPE_V1_SCHEMA,SCHEMA_ID,STATUS_ENUM,AVAILABILITY_ENUM— JSON-Schema mirror + enum sets.derive_status(envelope) -> StatusResult— canonical algorithm per App dispatch §4 binding contract (substance precedence + freshness override).StatusResult— output shape ofderive_status.Client— legacy flat-method class; emitsDeprecationWarningon__init__(v1.0.0 removal).
v0.4.0 — verb cascade + rich-data ripple
Response types shared across the triad:
Verdict— canonical verdict envelope with attestation.Attestation,SignedAttestation— signed provenance.RecommendedVersion,PackageRisk,PackageRef— rich-data fields.ScanResult,ScanResponse—scanendpoint.AuditWindow,AuditWindowResponse—auditendpoint.PolicyPreviewResult,PolicyPreviewResponse—policy preview.RiskAcceptResponse—risk-acceptsubmission response.
Sub-modules
Everything the flat surface re-exports also lives in a namespaced sub-module — import from either. Use the sub-module path when you need to disambiguate against a same-named symbol from a sister SDK.
cleanlib_sdk.client— legacyClient(deprecated).cleanlib_sdk.customer_state— v0.4.4 state taxonomy.cleanlib_sdk.derive_status—derive_status+StatusResult.cleanlib_sdk.errors— every exception in the hierarchy below.cleanlib_sdk.http— the threeHttp*Clients, wire-shapes, constants, helper functions.cleanlib_sdk.reason_codes—ReasonCode,ALL_REASON_CODES.cleanlib_sdk.schema—VERDICT_ENVELOPE_V1_SCHEMA, enum sets.cleanlib_sdk.transport— internalhttpx.AsyncClientwrapper (not re-exported at the top level; used by all threeHttp*Clients).cleanlib_sdk.types— response dataclasses.cleanlib_sdk.verdict_to_envelope—verdict_to_envelope_v1.
Error hierarchy
All errors descend from CleanLibraryError. Subclasses:
| Exception | HTTP | Triggered by |
|---|---|---|
PolicyDenyError |
403 / 451 | POLICY_DENY_VERDICT / POLICY_DENY_RULE_EXPLICIT |
IntegrityFailureError |
403 | INTEGRITY_FAILURE |
RateLimitExceededError |
429 | tier-throttled; carries retry_after_seconds |
RiskAcceptanceRequiredError |
403 | RISK_ACCEPTANCE_REQUIRED |
AuthenticationError |
401 / 403 | KEY_INVALID / KEY_EXPIRED / KEY_SCOPE_INSUFFICIENT |
InsufficientDataError |
403 | INSUFFICIENT_DATA_FAIL_CLOSED |
PackageNotFoundError |
404 | not in catalog + ingest declined |
ServerError |
5xx | retryable on 502/503/504 |
TransportError |
— | network / TLS / timeout / DNS |
ParseError |
— | response body shape mismatch |
Development
pip install -e ".[dev]"
pytest
ruff check .
Contract tests (tests/contract.py, tests/customer_state_contract.py,
tests/verdict_to_envelope_contract.py) load fixtures from
cleanlib-contract-fixtures and assert byte-identical behavior against
the sdk-js sister — do not skip these; a divergence is a wire-shape
regression.
Cross-references
- CleanLibrary docs — customer documentation portal
- Rust SDK:
cleanlib-client— reference implementation - Go SDK:
cleanlib-sdk-go - JavaScript SDK:
@cleanstart/cleanlib-sdk
License
Proprietary — CleanStart.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cleanlib_sdk-0.4.15.tar.gz.
File metadata
- Download URL: cleanlib_sdk-0.4.15.tar.gz
- Upload date:
- Size: 42.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
106182e740532fca0fcc51faabb5728f30173585f7b78c8bc804530a3e27eab7
|
|
| MD5 |
16e1b88307b2f6d359e0908c062fc441
|
|
| BLAKE2b-256 |
ceeeed9dcf4d0e757c4a8019cfc9a4f8538625f9e75ab1f1038b10ae9b978a4d
|
File details
Details for the file cleanlib_sdk-0.4.15-py3-none-any.whl.
File metadata
- Download URL: cleanlib_sdk-0.4.15-py3-none-any.whl
- Upload date:
- Size: 52.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d06435a5eb23f863ceebbb3656cc381b5e9b463929c366ea0b6dde4e8d9cb5a5
|
|
| MD5 |
e55dbf14326071489a7adbccd161bfe1
|
|
| BLAKE2b-256 |
0cb2c7153527525b37041f991eb37214f2fa42c1069e6b23204968beceae0d0c
|