Truthlocks MLflow integration
Build structured, hash-addressed evidence from MLflow metadata for your application's audit workflow.
Package: mlflow-maip · Python: 3.9+ · License: Apache-2.0
Developer documentation · Console
Install
python -m pip install mlflow-maip
Use a virtual environment and lock compatible framework versions with your application. The local example below needs no hosted credentials and makes no external requests.
Quickstart: create local evidence
from types import SimpleNamespace
from mlflow_maip import MAIPConfig, generate_receipt_from_run, hash_receipt_payload
run = SimpleNamespace(
info=SimpleNamespace(run_id="demo-run", experiment_id="demo-experiment",
artifact_uri="./artifacts", start_time=1700000000000,
end_time=1700000001000, status="FINISHED"),
data=SimpleNamespace(metrics={"accuracy": 0.95}, params={"epochs": "3"}, tags={}),
)
receipt = generate_receipt_from_run(run, config=MAIPConfig(auto_receipt=False))
assert receipt.payload_hash == hash_receipt_payload(receipt)
print(receipt.model_dump_json(indent=2))
Connect real data
Replace the demonstration object with a Run returned by your MLflow tracking client. Configure MLflow credentials separately. The builder extracts run metadata; it does not download or verify artifact contents.
Available interfaces
generate_receipt_from_run creates local run evidence and hash_receipt_payload recomputes its digest. The plugin module is a separate integration surface and must be explicitly configured.
Configuration
| Setting | Meaning |
|---|---|
auto_receipt=False |
Disable automatic hosted submission in integration hooks. |
agent_id |
Registered agent in the authenticated workspace, used for signing. |
tenant_id |
Workspace metadata; does not authorize API access. |
api_key, api_url |
Hosted transport configuration, separate from framework credentials. |
timeout |
HTTP timeout in seconds; default 30. |
verify_ssl |
TLS verification; keep enabled. |
Evidence and delivery guarantees
The local result is a Pydantic model with a payload_hash. Save it using
model_dump_json() and retain the metadata needed to reproduce it. Recomputing the
hash checks consistency of that local representation; it does not validate a server
signature, establish a trusted identity, or confirm transparency-log inclusion.
Metrics, parameters and artifact URI come from the supplied run. An artifact URI is not a hash of the artifact or proof of its availability.
Submit and verify hosted evidence (1.1.0+)
Register a machine identity in your workspace before submission. Set MAIP_AGENT_ID
to its identifier and MAIP_API_KEY to a workspace API key with access to machine
identities and receipts. Provider keys are separate. A tl_test_ key selects the
sandbox host unless MAIP_API_URL overrides it; production defaults to
https://api.truthlocks.com/v1. Do not use a tenant header as authentication.
This example submits the local receipt created above only when credentials are set:
import asyncio
import os
from maip_ai_connectors.client import MAIPClient
from maip_ai_connectors.config import MAIPConfig
async def submit_and_verify(local_receipt):
config = MAIPConfig(agent_id=os.environ["MAIP_AGENT_ID"],
api_key=os.environ["MAIP_API_KEY"])
async with MAIPClient(config) as client:
stored = await client.create_receipt(local_receipt)
check = await client.verify_receipt(stored.receipt_id)
if not check.valid or not check.signature_verified:
raise RuntimeError(check.reason or check.verdict)
print(stored.receipt_id, check.verdict)
if os.environ.get("MAIP_API_KEY") and os.environ.get("MAIP_AGENT_ID"):
asyncio.run(submit_and_verify(receipt))
The server stores integration metadata in a signed MAIP action receipt. Its
receipt_id differs from the local payload_hash. Verification checks the signature
and current lifecycle state; it does not establish transparency-log inclusion.
Old receipts whose signing key was lost return UNVERIFIABLE.
For automatic hooks, enable auto_receipt=True. In synchronous code delivery is
confirmed before the hook returns. In asynchronous code, call await wrapper.flush()
and await wrapper.aclose() before shutdown; inspect get_submitted_receipts() for
server responses. These lifecycle methods apply to AI wrappers/callbacks; data
clients use their async context manager or create_receipt_sync() instead.
Read retries are bounded; writes are never automatically replayed. After a timeout,
check the agent's receipts before retrying. Listing returns up to the latest 100
receipts for one agent, with integration filters applied to that page.
Troubleshooting
| Problem | Next step |
|---|---|
| Missing optional dependency | Install the framework/provider extra in the interpreter running your app. |
| Validation error | Supply the documented fields and types; do not substitute a whole response for one metadata object. |
| Hash changes | Compare serialized fields, including timestamps and identifiers. |
| Nothing appears in Console | Local builders do not submit records; configure a registered agent and await confirmed delivery. |
For support, share package and Python versions plus a sanitized example. Do not include keys, customer data or full authentication headers. No automatic compliance certification or fixed processing-latency guarantee is implied.
Automatic MLflow tracking
Version 1.1.0 registers the maip tracking-store scheme. To use a local SQLite
backend, set MLFLOW_TRACKING_URI=maip:sqlite:///mlflow.db, MAIP_API_KEY and
MAIP_AGENT_ID before starting your application. Configure an ordinary artifact
location for your experiment. Terminal runs receive a maip.receipt_id tag only
after receipt delivery succeeds. A failed submission keeps the MLflow run and sets
maip.receipt_status=delivery_failed; inspect logs before retrying.
A file URI such as maip:///absolute/path/mlruns is also supported. Recent MLflow
versions require explicit MLFLOW_ALLOW_FILE_STORE=true; SQLite is preferred.
The hook tracks run completion metadata, not every model-registry or tracing event.
Metadata
Release files for mlflow-maip 1.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 | |
|---|---|---|---|
| mlflow_maip-1.1.0.tar.gz | 13.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mlflow_maip-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.1 kB
Release files / mlflow_maip-1.1.0.tar.gz
| Download URL | mlflow_maip-1.1.0.tar.gz |
|---|---|
| Size | 13.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
86c47a85f3fd32d8a074a9e5274f65d6d7a7f68343bfc57db6b5ca0e588b303b
|
|
BLAKE2b-256 checksum How to use checksums |
1cb9371e93679386d66f29fb476e2c529ee9eaf24dedac48ef7d717dd0159828
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|
Release files / mlflow_maip-1.1.0-py3-none-any.whl
| Download URL | mlflow_maip-1.1.0-py3-none-any.whl |
|---|---|
| Size | 12.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2c1c880b0fa6ef1e48fdb847fbe82c8ce28551b49be0c498605b0c6ff65797b3
|
|
BLAKE2b-256 checksum How to use checksums |
6f7fad6f4ef883e3ba6fcc7fa8a2487c611b797983994a550dfe7ae5c9c2967b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|