Rust-accelerated structured data encoder for LLM token compression
Project description
sd-encoder
Rust-Accelerated Structured Data Encoder for LLMs
Compress structured data into compact token sequences — 40–85% fewer tokens, no model retraining, no heavy dependencies.
sd-encoder is the standalone Structured Data Encoder from CLM, compiled in Rust and exposed as a Python extension. It encodes dicts, lists, and nested objects into compact token sequences that LLMs interpret with equal or better accuracy at a fraction of the token cost.
Install it on its own if you only need structured data encoding — no spaCy, no NLP stack, no unnecessary overhead.
| Input | Typical Compression |
|---|---|
| Product catalogs | 55–85% |
| Knowledge bases | 40–75% |
| Business rules | 50–80% |
| API responses | 45–70% |
Installation
pip install sd-encoder
No additional downloads required. Pre-built wheels are available for Linux (x86_64, aarch64), macOS (Intel, Apple Silicon), and Windows.
Quick Start
from sd_encoder import SDEncoderV2, SDCompressionConfig
config = SDCompressionConfig(preserve_structure=True, auto_detect=True)
encoder = SDEncoderV2(config)
catalog = [
{"article_id": "KB-001", "title": "Reset Password", "content": "To reset your password...", "tags": ["security"]},
{"article_id": "KB-002", "title": "Update Billing", "content": "To update your billing...", "tags": ["billing"]},
]
result = encoder.encode_validated(catalog)
print(result.compressed)
# {article_id,title,content,tags}[KB-001,Reset Password,To reset your password...,security][KB-002,Update Billing,To update your billing...,billing]
print(f"{result.compression_ratio():.1f}% reduction")
print(f"{result.n_tokens()} → {result.c_tokens()} tokens")
Configuration
SDCompressionConfig controls field selection, truncation, and structure preservation. All parameters are optional.
from sd_encoder import SDCompressionConfig, FieldImportance
config = SDCompressionConfig(
# Field selection
required_fields=["id", "title", "status"], # always include these
excluded_fields=["internal_notes", "raw_log"], # always drop these
drop_non_required_fields=False, # if True, emit only required_fields
# Importance filtering
auto_detect=True, # infer importance from field name/value
importance_threshold=FieldImportance.MEDIUM, # drop fields below this level
field_importance={ # explicit overrides
"summary": FieldImportance.HIGH,
"version": FieldImportance.LOW,
},
# Truncation
max_truncation_length=300, # global string truncation
max_truncation_mapping={ # per-field truncation
"description": 150,
"content": 500,
},
# Structure
preserve_structure=True, # encode nested objects inline
default_fields_order=["id", "title", "status"], # pin ordering of known fields
)
Field Importance
FieldImportance controls the auto-detection threshold. Values are ordered — NEVER < LOW < MEDIUM < HIGH < CRITICAL.
from sd_encoder import FieldImportance
FieldImportance.NEVER # always drop
FieldImportance.LOW # drop when filtering
FieldImportance.MEDIUM # include by default
FieldImportance.HIGH # always include unless explicitly excluded
FieldImportance.CRITICAL # never drop (ids, names, titles)
# Comparable
FieldImportance.HIGH >= FieldImportance.MEDIUM # True
int(FieldImportance.HIGH) # 3
Auto-detection applies heuristics to field names and values when auto_detect=True:
| Pattern | Detected importance |
|---|---|
id, uuid, name, title |
CRITICAL |
status, priority, details |
HIGH |
description, type, channel |
MEDIUM |
source, version, metadata |
LOW |
_*, *_at, *_date |
NEVER |
| Empty or very short values | NEVER |
Output
encode_validated runs compression then strips redundant whitespace and falls back to the original if the compressed output is larger.
result = encoder.encode_validated(data)
result.compressed # str — the encoded token sequence
result.original # original input, returned as Python dict/list
result.component # "ds_compression"
result.n_tokens() # estimated token count of original
result.c_tokens() # estimated token count of compressed
result.compression_ratio() # float — percentage reduction
# Validate manually if needed
result = encoder.encode(data)
result.validate_compression_ratio() # fall back to original if compressed is larger
result.validate_compressed() # strip redundant whitespace
Use encode directly when you want to inspect the output before deciding whether to validate.
Encoding Examples
Single object:
encoder.encode_validated({"id": "T-42", "title": "Login fails", "status": "open", "priority": "high"})
# {id,title,status,priority}[T-42,Login fails,open,high]
Nested object:
encoder.encode_validated({
"user": {"id": "U-1", "name": "Ana"},
"ticket": {"id": "T-42", "status": "open"}
})
# {user:{id,name},ticket:{id,status}}[U-1,Ana][T-42,open]
List of dicts (table encoding):
encoder.encode_validated([
{"id": 1, "name": "Laptop", "status": "active"},
{"id": 2, "name": "Monitor", "status": "active"},
])
# {id,name,status}[1,Laptop,active][2,Monitor,active]
With field filtering:
config = SDCompressionConfig(
required_fields=["id", "title"],
drop_non_required_fields=True,
)
encoder = SDEncoderV2(config)
encoder.encode_validated({"id": 1, "title": "Test", "internal_log": "...", "raw": "..."})
# {id,title}[1,Test]
Relationship to CLM
sd-encoder is the engine behind the Structured Data encoder in CLM. If you need thread or system prompt encoding alongside structured data, install the full library instead:
pip install clm-core
sd-encoder is the right choice when:
- You only need structured data encoding
- You want to avoid the spaCy dependency
- You're deploying in a constrained environment
- You're integrating encoding into a Rust or polyglot pipeline
License
Dual-licensed:
- AGPL-3.0 — free for open source use (LICENSE-AGPL)
- Commercial — for proprietary products and SaaS (contact)
Issues · Discussions · Contact
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
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 sd_encoder-0.1.1.tar.gz.
File metadata
- Download URL: sd_encoder-0.1.1.tar.gz
- Upload date:
- Size: 54.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1cc0d499b634f1775ae7bf3f2fef65a4ddc5d17d90a766ac694ae91438cbac1
|
|
| MD5 |
18e35cd13837c06946f662f8f1a5a85d
|
|
| BLAKE2b-256 |
a015f52bddb441d6d144668311ee75efe6b4eeaf54781df84ca113d0be7ba2d3
|
File details
Details for the file sd_encoder-0.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.1 MB
- Tags: PyPy, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d084f0a1285f2f53d8bd5afd9e7604a9601a6ff362f1d88ce7fe0f3aed144ee0
|
|
| MD5 |
bc73f3a7df583a860b42ad04bcc476c1
|
|
| BLAKE2b-256 |
8520f45dff55cb218a81829ae909315649fce25dd23ed6139acb67b982cf3cfd
|
File details
Details for the file sd_encoder-0.1.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.15, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ed9dada77f2b4a5a6883972c874d45a6ba2b0f8bba1f18b0256ebabbbabd41f
|
|
| MD5 |
b09c7586203dc457ba1e7c8b0d48bd72
|
|
| BLAKE2b-256 |
a8baa76e28e64e802e4c7c6ef18cfacaaeecba73d510f043126a46aaa5b790b2
|
File details
Details for the file sd_encoder-0.1.1-cp314-cp314-win_amd64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp314-cp314-win_amd64.whl
- Upload date:
- Size: 861.8 kB
- Tags: CPython 3.14, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
14df4c26063d069428e2a1312ca1dd27f964625cf21619363aacddd452e15b7c
|
|
| MD5 |
2e2fd3725afba5e29e85cf29921ac3a9
|
|
| BLAKE2b-256 |
3c54ab3a316cdf691c798d3d4d4e8d5b93723e513975f8e040a2bf759938bd5b
|
File details
Details for the file sd_encoder-0.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.14, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e4686bfea6c20e6d1c5d0349b934fb006681767f0e809193e63770535559cf8
|
|
| MD5 |
7fda51ce2dd3444a59dcd096282f35a0
|
|
| BLAKE2b-256 |
6f163d3fc502197e374a2bfab51725dbc3009649e5d685a7655ece015f922346
|
File details
Details for the file sd_encoder-0.1.1-cp314-cp314-macosx_11_0_arm64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp314-cp314-macosx_11_0_arm64.whl
- Upload date:
- Size: 964.1 kB
- Tags: CPython 3.14, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a1772ec7d446d6624c5dcd03d8f03fc05815c01c76c6864426f30ceb801e8c1
|
|
| MD5 |
a9056005e39c5d2664189e6ce0daa66f
|
|
| BLAKE2b-256 |
92355a563c586c79937a1f58b39a721850c96c753c2655cfdfcb782ac77bf14a
|
File details
Details for the file sd_encoder-0.1.1-cp314-cp314-macosx_10_12_x86_64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp314-cp314-macosx_10_12_x86_64.whl
- Upload date:
- Size: 1.0 MB
- Tags: CPython 3.14, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
71cdb5449772345949841a9325a33bcf60be20bc539f1236df089a6ed4dd5337
|
|
| MD5 |
0d960696d98c43c472767db0a8a4685e
|
|
| BLAKE2b-256 |
468b767e5ee88f0a6da1d7c0f2b1f377e2262437d3a1baa33ba47cfe8ecafde9
|
File details
Details for the file sd_encoder-0.1.1-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 861.6 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
50a069be7be22e6e7cbeba2b014e89724db5600525fa2f8698a7959fa53d6a73
|
|
| MD5 |
aaafe6bc6946d05a89622e7314092be5
|
|
| BLAKE2b-256 |
734b878d800153a3568d8962ba9ccd15d1451758426a9deb7e04d4d7df17e293
|
File details
Details for the file sd_encoder-0.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
39b0e0e2ae2f37717c2b832dc5821b33168775a7727fdbfeb7565404a493027b
|
|
| MD5 |
4ae18e8a43c16d7af0921fecd406464f
|
|
| BLAKE2b-256 |
ab6cbce0a74de9f74cbdae03b70f539004b8f003acad71dd74cf84bfeb39e94e
|
File details
Details for the file sd_encoder-0.1.1-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 964.2 kB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb7b6df187abf98347d0c81b19a0bf57929047cf83d976b5f83a6e81f9ce56de
|
|
| MD5 |
2fb077bffba95bd3d90f0e4bebccc1f8
|
|
| BLAKE2b-256 |
24fd6182c288e7a5294f41e29301688a55b568d96fe24dde090cc675de8a6d69
|
File details
Details for the file sd_encoder-0.1.1-cp313-cp313-macosx_10_12_x86_64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp313-cp313-macosx_10_12_x86_64.whl
- Upload date:
- Size: 1.0 MB
- Tags: CPython 3.13, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a8fdea07785fcdc5a410c4c42ec5d38536117af82e5939a75af6bb332dbf165b
|
|
| MD5 |
649b8034b2f7081636d4eb344e8dbee1
|
|
| BLAKE2b-256 |
813ec7eea97cd80cbae65ec826503bf338ce87494e41c90ed69f5577ed08fe35
|
File details
Details for the file sd_encoder-0.1.1-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 862.0 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a0f09b53a0e2a8a922161ba7cc08471285169c3540b450bc01fc438b2c6023b6
|
|
| MD5 |
9acf2b3b0f006b3e83b50cf3a609c28b
|
|
| BLAKE2b-256 |
ae185552f89ab5117665fa5635dcdd94ac0eafc27b4c3bf4766274e33dcedd5a
|
File details
Details for the file sd_encoder-0.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5042ff2fb334510eabc97d1029ce83feda58f5f48117144a4fec460802785aa7
|
|
| MD5 |
b3aa5d349d758f1f5ee2d12e59a8a973
|
|
| BLAKE2b-256 |
83f66ea0af233303d0a5d977665b8f785807511faeab06f4ceeec2bc744cd690
|
File details
Details for the file sd_encoder-0.1.1-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 965.4 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4b16fa49acc4141704a42c3932f33304e1e551d304ab8bfd0f550cb291a8fde1
|
|
| MD5 |
d2e0292578684a56069f75f981bf2ba6
|
|
| BLAKE2b-256 |
9df6a6cf09206dd9cc8fb921a38412ff728b990b92992e1d06e8a6dc87db4d1b
|
File details
Details for the file sd_encoder-0.1.1-cp312-cp312-macosx_10_12_x86_64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp312-cp312-macosx_10_12_x86_64.whl
- Upload date:
- Size: 1.0 MB
- Tags: CPython 3.12, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4157769ba473e39b02d1e8eb721e27960819a912ea0577fa0d526ea104f39c13
|
|
| MD5 |
03551bce51318ae44c92776c9e27abed
|
|
| BLAKE2b-256 |
19b746c8b037f58c52ba07628a3778f6f6809bb24185901b9a492d4f0626ecd7
|
File details
Details for the file sd_encoder-0.1.1-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 863.5 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
666709efa0d9ea5341ab73f952dac3ba2a4defac530fd8c2d969fccd9a29e8b7
|
|
| MD5 |
b53244cc35f5051cf6889c57afbe5372
|
|
| BLAKE2b-256 |
4068d2d2c2eb218488b2ae6dc0a1a594aff2fbebe2479c8cf84f72a14282f2c9
|
File details
Details for the file sd_encoder-0.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d76401bcc2144cb7b30b48bfbc5aac5d42c4836f4aa9bd5404fc3b381bfa8ec4
|
|
| MD5 |
82a40f70bad5ea79eee2dece74d4ee70
|
|
| BLAKE2b-256 |
3fbdd204081942c71e9f5b8d935280d5e341ddb2a11fddb0d4059e22e5720eb6
|
File details
Details for the file sd_encoder-0.1.1-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 968.3 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ad7eb0ff9aa264053097946acc05332c3f6d4a1ae13af0fe6b4dfa5f8704598
|
|
| MD5 |
41b47a7f90b4489a15f3ef0a698ca6b5
|
|
| BLAKE2b-256 |
a651140b27e39b1fbc5a9ef03b4bdd496053ad0cd961384cafcc8b2c1fc3a6f5
|
File details
Details for the file sd_encoder-0.1.1-cp311-cp311-macosx_10_12_x86_64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp311-cp311-macosx_10_12_x86_64.whl
- Upload date:
- Size: 1.0 MB
- Tags: CPython 3.11, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c26825f43f9a8937215557c3814ee77678a4b933c44146a56f127f7f86a2497
|
|
| MD5 |
af027c42a2e6962989de91f62d844a6b
|
|
| BLAKE2b-256 |
f55585ee9368ac54cedd7e5576e5e745944d1beadf115362e09a14d26ef67940
|
File details
Details for the file sd_encoder-0.1.1-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 863.4 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34e8f5f42b26d637152abda707cbd0918c74fe2d9e169908a4177cfe4f03c849
|
|
| MD5 |
f70bc602963f197412481ba60f700626
|
|
| BLAKE2b-256 |
1b7b077767c61aa234358d8871c832dc524e8c07603cbce997bb66e60f4342d3
|
File details
Details for the file sd_encoder-0.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
05fa15e1ca0dc43382db9124cbfcfa4e6236e70fa2fb427d060c41101bfcacf0
|
|
| MD5 |
5e3154ed381649d416ee6001168ea08d
|
|
| BLAKE2b-256 |
e2f37c5cff271c2a76466148bc5e4dc838941a0b50f2e16b9add0ae4cc41b57d
|
File details
Details for the file sd_encoder-0.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: sd_encoder-0.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.9, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b862e3bb50310fe47ef9ec302b79c04e12f7ede05c0388fd3efcdef525b59ac
|
|
| MD5 |
a2f84dd1ad64735e70f516c04eb0be3b
|
|
| BLAKE2b-256 |
270c753db3cabb72ba2d50256071a7ec5a48096611f68af9a18064aba8be24cd
|