dagnam-contracts
The canonical component/parameter validation contract for Dagnam.AI — the generated component schema plus a dependency-free interpreter of it.
An architecture is validated in three places: the platform backend when a project
is saved, the dagnam SDK before a job is submitted, and the Studio as nodes are
dragged onto the canvas. All three must reach identical verdicts — a parameter
the Studio accepts and the backend rejects is a bug the user experiences as the
product lying to them. This package is the one definition they all read.
import dagnam_contracts as contracts
errors = contracts.validate_params(
"convolution-layer", {"filters": -999}, node_id="conv_1"
)
for e in errors:
print(e.message)
# convolution-layer: filters must be at least 1, got -999
# convolution-layer: missing required parameter 'kernelSize'
Zero dependencies, by design
This package installs nothing else. That is a constraint rather than a
coincidence: the dagnam SDK ships with only requests and numpy, so a
contract package it depends on must add nothing.
It is why the Pydantic registry that authors the schema stays out of the distribution — the wheel carries generated JSON and a plain-Python interpreter of it, and the typed authoring format lives in the repository instead.
Dataset hygiene and prompt rendering
Since 0.2.0 the Python package also ships the dataset-hygiene primitives the
platform and the dagnam SDK share — so a redaction, a dedup pass or a
contamination check reaches the same verdict wherever it runs — and the one
function that renders a chat request as classifier input text, so the text a
classifier saw in training is byte-for-byte the text it sees when served.
Results are frozen dataclasses; everything is standard library only.
from dagnam_contracts import (
apply_pii_policy, compute_exact_duplicates, compute_near_duplicates,
compute_split_overlap, parse_chat_prompt, redact_rows, render_chat_prompt, scan_rows,
)
report = scan_rows(rows) # counts_by_code, issues, pass_list, disclaimer
rows, changed, removed = apply_pii_policy(rows, {"PII_EMAIL": "redact"})
redacted, counts = redact_rows(rows) # every class, scan-clean by construction
compute_exact_duplicates(rows).duplicate_indices
compute_near_duplicates(rows, threshold=0.9).pairs
compute_split_overlap({"train": train_rows, "test": test_rows}).has_contamination
render_chat_prompt([{"role": "user", "content": "hi"}], system="Label it.")
# '<|system|>\nLabel it.\n<|user|>\nhi\n'
parse_chat_prompt("<|user|>\nhi\n") # the inverse, for replaying a holdout
# [{'role': 'user', 'content': 'hi'}]
The PII scan is best-effort by contract: its result names the classes it looked
for (pass_list) and carries a disclaimer, and nothing here ever reports data
as "clean". These modules are Python-only: @dagnam/contracts (npm) carries the
schema interpreter plus, since 0.3.1, the audit's reference rows and serving rate
card, and since 0.4.0 the PII class names — the data a Studio displays, never the
logic that computes a verdict.
Since 0.4.0 the scan also finds credentials in the formats it knows
(PII_SECRET: provider keys, JWTs, PEM private keys, Bearer tokens,
password=-style assignments, the value of a JSON key named like a credential
and, since 0.4.1, a password in a URL or after pwd=), redacted as <SECRET>.
A credential in no known format (a bare AWS secret key, a passphrase in prose)
is not found. Redaction keeps JSON valid: a JSON object or array inside a row,
or the text handed to redact_json_text, is read and redacted value by value.
Since 0.4.1 a member of the row itself under a credential column name
(password, client_secret, api_key, db_password, ...) is found too, a
string or a number, and every scalar in a list or object under it. A flag
column (has_password, is_secret, top_secret) and a blank or flag-like
value (yes, no, true, n/a, none, -) are not secrets. A name an id
column also carries (row_key, nextPageToken) decides nothing there, a bare
number in a row is not scanned, and a row's keys are left as they are. A URL's
password is replaced as a secret; with a dotted host the host goes with it
(ftp://anonymous:pw@ftp.example.com/ becomes ftp://anonymous:<SECRET>/),
because the email pattern reads pw@ftp.example.com as an address and the two
overlap.
A placeholder is an opaque token, and a finding is decided on the text between
placeholders, read as a string of its own. So rows redacted for every class
scan clean by construction, for every row shape and any number of findings, with
no exception: scan_rows of the result finds nothing, redacting it again returns
it, and the count for the original is the number of placeholders written (in a
document, two keys that redact to one placeholder collide and one member takes the
other's place; and in one that parses only once its redaction has replaced something,
a member taken whole removes the placeholders of findings in its value that the scan
counted).
redact_rows(rows) is that redact-everything policy in one call, returning the
rows and the counts; call it last, on the row exactly as it will be uploaded
(after any cut to a length), because a cut after redaction can split a
placeholder into text a scan reads. A policy that redacts only some classes
replaces exactly the findings the scan reports for them and promises nothing more
about a later scan of the row.
0.4.0 also finds IBANs, IP addresses, dates of birth (beside a birth keyword),
UK NINOs, Canadian SINs, Indian Aadhaar and PAN numbers and EU VAT numbers,
each checksum-, parser-, format- or keyword-backed and under its own code.
Versioning
dagnam-contracts and @dagnam/contracts (npm) are published together at the
same version and carry a byte-identical schema, so a version number describes one
contract across both ecosystems. Breaking schema changes take a major bump, and
each consumer upgrades deliberately.
License
Apache-2.0. Source: https://github.com/Dagnam-AI/dag-contracts
Metadata
Release files for dagnam-contracts 0.4.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 | |
|---|---|---|---|---|
| dagnam_contracts-0.4.1.tar.gz | 160.4 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dagnam_contracts-0.4.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 233.7 kB
Release files / dagnam_contracts-0.4.1.tar.gz
| Download URL | dagnam_contracts-0.4.1.tar.gz |
|---|---|
| Size | 160.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ef7c4121083591a2b82a44b768a4fb654f406d0be456451a4700ab561514485f
|
|
BLAKE2b-256 checksum How to use checksums |
72c36598319d02ee9a72b372b66548a6323b203ecfd2401d267dd56749c70f59
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
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 4, 2026.
Transparency logRelease files / dagnam_contracts-0.4.1-py3-none-any.whl
| Download URL | dagnam_contracts-0.4.1-py3-none-any.whl |
|---|---|
| Size | 73.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
507cd65952c6feb185e9698205b579768b1e33fa9ed8bd7029fdcdba9c58f6bd
|
|
BLAKE2b-256 checksum How to use checksums |
d94f7cca9d4b075056cfbbb9c32f1fc4144959618cc11eacf1ab08608187c181
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
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 4, 2026.
Transparency logSecurity for dagnam-contracts 0.4.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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for dagnam_contracts-0.4.1.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 4, 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.