GLLM Privacy
Description
A library to protect Personal Identifiable Information (PII) in a Generative AI project.
Installation
Prerequisites
Mandatory:
- Python 3.11+ — Install here
- pip — Install here
- uv — Install here
Extras (required only for Artifact Registry installations):
- gcloud CLI (for authentication) — Install here, then log in using:
gcloud auth login
Option 1: Install from Artifact Registry
This option requires authentication via the gcloud CLI.
uv pip install \
--extra-index-url "https://oauth2accesstoken:$(gcloud auth print-access-token)@glsdk.gdplabs.id/gen-ai-internal/simple/" \
gllm-privacy
Option 2: Install from PyPI
This option requires no authentication. However, it installs the binary wheel version of the package, which is fully usable but does not include source code.
uv pip install gllm-privacy-binary
Local Development Setup
Prerequisites
-
Python 3.11+ — Install here
-
pip — Install here
-
uv — Install here
-
gcloud CLI — Install here, then log in using:
gcloud auth login
-
Git — Install here
-
Access to the GDP Labs SDK GitHub repository
1. Clone Repository
git clone git@github.com:GDP-ADMIN/gl-sdk.git
cd gl-sdk/libs/gllm-privacy
2. Setup Authentication
Set the following environment variables to authenticate with internal package indexes:
export UV_INDEX_GEN_AI_INTERNAL_USERNAME=oauth2accesstoken
export UV_INDEX_GEN_AI_INTERNAL_PASSWORD="$(gcloud auth print-access-token)"
export UV_INDEX_GEN_AI_USERNAME=oauth2accesstoken
export UV_INDEX_GEN_AI_PASSWORD="$(gcloud auth print-access-token)"
3. Quick Setup
Run:
make setup
4. Activate Virtual Environment
source .venv/bin/activate
Local Development Utilities
The following Makefile commands are available for quick operations:
Install uv
make install-uv
Install Pre-Commit
make install-pre-commit
Install Dependencies
make install
Update Dependencies
make update
Run Tests
make test
Run unit tests and model-free integration tests without downloading neural checkpoints:
uv run pytest
The download-backed Indonesian model tests are opt-in. To include them (requires network access and time to download the checkpoint and initialize its inference backend):
RUN_REAL_MODEL_TESTS=1 uv run pytest
Use uv run pytest -rs to display skipped-test requirements.
Usage
from gllm_privacy.pii_detector import TextAnalyzer, TextAnonymizer
from gllm_privacy.pii_detector.constants import Entities
from gllm_privacy.pii_detector.anonymizer import Operation
from asyncio import run
text = """
contoh nomor ktp 3525011212941001
repeat nomor ktp 3525011212941001
contoh email john.doe@example.com
contoh nomor telepon +628121729819 dan 0812898029384.
contoh npwp 01.123.456.7-891.234
"""
text_analyzer = TextAnalyzer()
entities = [Entities.EMAIL_ADDRESS, Entities.KTP, Entities.NPWP, Entities.PHONE_NUMBER]
text_anonymizer = TextAnonymizer(text_analyzer)
anonymized_text = run(text_anonymizer.run(text=text, entities=entities))
print(anonymized_text)
deanonymized_text = run(text_anonymizer.run(text=text, entities=entities, operation=Operation.DEANONYMIZE))
print(deanonymized_text)
If you need to detect person, organization, or location entities in text written in Bahasa Indonesia, you can use either
TransformersRecognizer or ProsaRemoteRecognizer. To use the TransformersRecognizer, you can use it like this:
from gllm_privacy.pii_detector.recognizer.config import CAHYA_BERT_CONFIGURATION
from gllm_privacy.pii_detector.recognizer.transformers_recognizer import TransformersRecognizer
from gllm_privacy.pii_detector import TextAnalyzer, TextAnonymizer
from gllm_privacy.pii_detector.constants import Entities
# Load the model, if you run it for the first time, it will download the model from the Hugging Face model hub
transformers_recognizer = TransformersRecognizer(
model_path=CAHYA_BERT_CONFIGURATION.get("DEFAULT_MODEL_PATH"),
supported_entities=CAHYA_BERT_CONFIGURATION.get("PRESIDIO_SUPPORTED_ENTITIES"),
)
transformers_recognizer.load_transformer(**CAHYA_BERT_CONFIGURATION)
analyzer = TextAnalyzer(additional_recognizers=[transformers_recognizer])
text = "John Doe adalah seorang karyawan PT ABCD yang berlokasi di Jakarta."
text_analyzer = TextAnalyzer(additional_recognizers=[transformers_recognizer])
entities = [Entities.PERSON, Entities.LOCATION]
text_anonymizer = TextAnonymizer(text_analyzer)
anonymized_text = text_anonymizer.anonymize(text=text, entities=entities)
print(anonymized_text)
deanonymized_text = text_anonymizer.deanonymize(text=text)
print(deanonymized_text)
Detecting Brand Names
BRAND_NAME is a supported entity. Like PERSON, it is detected by a model-backed recognizer instead of a built-in
regex pattern. Point the model's brand label at BRAND_NAME in MODEL_TO_PRESIDIO_MAPPING, add BRAND_NAME to
supported_entities, then request it during analysis or anonymization:
from gllm_privacy.pii_detector import TextAnalyzer, TextAnonymizer
from gllm_privacy.pii_detector.constants import Entities
from gllm_privacy.pii_detector.recognizer.config import CAHYA_BERT_CONFIGURATION
from gllm_privacy.pii_detector.recognizer.transformers_recognizer import TransformersRecognizer
configuration = {
**CAHYA_BERT_CONFIGURATION,
"PRESIDIO_SUPPORTED_ENTITIES": [*CAHYA_BERT_CONFIGURATION["PRESIDIO_SUPPORTED_ENTITIES"], "BRAND_NAME"],
"MODEL_TO_PRESIDIO_MAPPING": {**CAHYA_BERT_CONFIGURATION["MODEL_TO_PRESIDIO_MAPPING"], "BRD": "BRAND_NAME"},
}
brand_recognizer = TransformersRecognizer(
model_path="<YOUR_BRAND_NER_MODEL>",
supported_entities=configuration["PRESIDIO_SUPPORTED_ENTITIES"],
)
brand_recognizer.load_transformer(**configuration)
text = "Saya memakai sepatu Nike."
text_analyzer = TextAnalyzer(additional_recognizers=[brand_recognizer])
text_anonymizer = TextAnonymizer(text_analyzer, add_default_faker_operators=True)
entities = [Entities.BRAND_NAME]
anonymized_text = text_anonymizer.anonymize(text=text, entities=entities)
print(anonymized_text)
print(text_anonymizer.deanonymize(text=anonymized_text))
With add_default_faker_operators=True, BRAND_NAME values are pseudo-anonymized with Faker company names (fake.company()). Without it,
they are replaced by the default <BRAND_NAME_n> placeholder.
The brand recognizer also accepts LINE_BREAK_TOKEN and CHUNK_SIZE:
LINE_BREAK_TOKEN(str | None, defaultNone): token the model was trained on to represent a line break (for example"→"). When set, every"\n"in the input is replaced by" <token> "before inference and detected offsets are mapped back to the original text. Newlines remain intact when the model predicts separate entities per line; this is not enforced by the mapper. Leave it unset for models trained without a break token — their input is passed through unchanged. A literal token already present in the text is preserved and may split a model span. Conversely, a model span crossing an inserted token includes the original newline, so masking that span removes the line break. Such spans are not split into per-line results.CHUNK_SIZE(int): maximum tokens per chunk, including special tokens. Set it to the model's real limit (for example512for XLM-R based checkpoints) so long multi-line documents are chunked instead of truncated.
Enhanced TransformersRecognizer with Optimum
The TransformersRecognizer supports Hugging Face Optimum for faster
inference. Choose the backend with OPTIMUM_BACKEND in the configuration passed to load_transformer.
Available Backends:
OPTIMUM_BACKEND |
Runtime | Extra to install |
|---|---|---|
auto (default) |
The best available: ONNX Runtime with CUDA, then ONNX Runtime on CPU, then Apple Silicon MPS, then standard transformers | Any of the extras below |
onnx |
ONNX Runtime with the CPU provider | optimum-onnx |
cuda |
ONNX Runtime with the CUDA provider | optimum-cuda |
openvino |
OpenVINO | optimum-openvino |
mps |
PyTorch on Apple Silicon MPS | transformers |
transformers |
Standard transformers pipeline | transformers |
When the requested backend is not available, the recognizer logs a warning and falls back: onnx and cuda fall back
to transformers, cuda without a GPU falls back to onnx, openvino falls back to onnx, then to
transformers, and mps without Apple Silicon falls back to the standard CPU pipeline.
Configuration Options:
config = {
**CAHYA_BERT_CONFIGURATION,
"OPTIMUM_BACKEND": "auto", # "auto", "onnx", "cuda", "openvino", "mps", "transformers"
"OPTIMUM_DEVICE": "auto", # "auto", "cuda", "mps", "cpu"
"ONNX_INTRA_OP_THREADS": 0, # 0 lets ONNX Runtime decide
"ONNX_INTER_OP_THREADS": 0, # 0 lets ONNX Runtime decide
"ONNX_ENABLE_CPU_MEM_ARENA": True,
"OPENVINO_PERFORMANCE_HINT": "THROUGHPUT", # "THROUGHPUT" or "LATENCY"
"OPENVINO_NUM_STREAMS": "AUTO",
"OPENVINO_INFERENCE_NUM_THREADS": 0, # 0 lets OpenVINO decide
}
Usage Example:
from gllm_privacy.pii_detector import TextAnalyzer
from gllm_privacy.pii_detector.recognizer.config import CAHYA_BERT_CONFIGURATION
from gllm_privacy.pii_detector.recognizer.transformers_recognizer import TransformersRecognizer
config = {**CAHYA_BERT_CONFIGURATION, "OPTIMUM_BACKEND": "onnx"}
transformers_recognizer = TransformersRecognizer(
model_path=config["DEFAULT_MODEL_PATH"],
supported_entities=config["PRESIDIO_SUPPORTED_ENTITIES"],
)
transformers_recognizer.load_transformer(**config)
pipeline_info = transformers_recognizer.get_pipeline_info()
print(f"Backend: {pipeline_info['backend']}")
print(f"Device: {pipeline_info['device']}")
print(f"Optimizations: {pipeline_info['optimizations']}")
# Use as before
analyzer = TextAnalyzer(additional_recognizers=[transformers_recognizer])
To use the ProsaRemoteRecognizer, you can use it like the following example.
Please replace <PROSA_API_URL> and <PROSA_API_KEY> with the valid values.
from gllm_privacy.pii_detector.recognizer.prosa_remote_recognizer import ProsaRemoteRecognizer
from gllm_privacy.pii_detector import TextAnalyzer, TextAnonymizer
from gllm_privacy.pii_detector.constants import Entities
text = "John Doe adalah seorang karyawan PT ABCD yang berlokasi di Jakarta."
prosa_recognizer = ProsaRemoteRecognizer('<PROSA_API_URL>', '<PROSA_API_KEY>')
text_analyzer = TextAnalyzer(additional_recognizers=[prosa_recognizer])
entities = [Entities.PERSON, Entities.LOCATION]
text_anonymizer = TextAnonymizer(text_analyzer)
anonymized_text = text_anonymizer.anonymize(text=text, entities=entities)
print(anonymized_text)
deanonymized_text = text_anonymizer.deanonymize(text=text)
print(deanonymized_text)
Error Handling
Errors raised by gllm-privacy subclass BasePrivacyError, which is built on BaseError from gllm-core.
Each error has a stable code, a message that you can show to users, a debug_info dict for logs, and a
recovery dict that says whether a retry can succeed. str(error) returns only the message.
Diagnostics contain metadata only. They exclude external messages, URLs, source frames, request payloads,
response bodies, and headers. Unknown language values do not enter diagnostics.
The default messages are written for end users. They do not name the library, the model, or a setting. The
developer fix for each code is in the table below. Some errors include a library-authored explanation in
debug_info.get("reason"). This field is optional. Normalized fallback errors identify the original error type instead.
Branch on code, not on the message. Each error also keeps its previous builtin base, such as ValueError,
so existing except clauses keep working.
from gllm_privacy.exceptions import BasePrivacyError, BaseRemoteRecognizerError
try:
results = text_analyzer.analyze(text=text, language="id", entities=entities)
except BaseRemoteRecognizerError as error:
# A remote NER service failed. The text was not checked, so do not treat it as PII-free.
logger.warning("PII detection failed: %s", error.code, extra={"debug_info": error.debug_info})
# Retry only through the bounded caller policy described below.
raise
except BasePrivacyError as error:
logger.error("PII detection failed: %s", error.code, extra={"debug_info": error.debug_info})
raise
Remote recognizers (ProsaRemoteRecognizer, GDPLabsNerApiRemoteRecognizer, and
GDPLabsNerApiRemoteRecognizerAsync) use specific remote error codes for known transport and response failures.
Unexpected remote failures use the non-retryable PrivacyRuntimeError fallback.
TextAnalyzer.analyze and TextAnonymizer.anonymize also normalize unexpected operation failures.
Transformers inference uses ModelInferenceError. Backend creation uses ModelLoadError.
None of these boundaries return an empty result in place of a failure.
Existing typed errors retain their identity. These boundaries do not convert cancellation or process-control signals into Privacy errors.
Default tracebacks suppress raw upstream exception context. Python still retains the original context in memory.
Do not serialize __context__, exception objects, local variables, or source frames to a log or response.
Service log policy
The library retains safe operational logs for dependency availability, backend selection, and model lifecycle events.
These logs exclude raw exceptions, model paths, detected text, and arbitrary configuration values.
Failure-path logs use fixed messages. A secondary log failure does not interrupt backend fallback or best-effort client cleanup.
The service owns its log sinks and dependency log policy. Existing Presidio log suppression remains unchanged.
HTTP clients can put full URLs in INFO or DEBUG logs. Model dependencies can expose model paths or input values.
Use WARNING or higher for HTTP client logs. Disable raw dependency output unless the service applies a reviewed allowlist.
Do not treat this level policy as a redactor for arbitrary dependency warnings.
Use only error.code, error.message, and reviewed diagnostic fields at the service boundary.
The service must exclude request bodies, headers, and raw exception text from all sinks.
Bounded retries and escalation
TextAnalyzer.analyze raises UnsupportedLanguageError when no recognizer supports the language, and
InvalidInputError when no recognizer can detect any of the requested entities.
Only the remote timeout, connection, rate limit and server errors are retryable. A rate limit or server error
also carries recovery["retry_after_seconds"] when the service sends a valid Retry-After header.
The library does not retry automatically.
Use the executable caller example for an idempotent synchronous operation.
It permits three total attempts. Without Retry-After, it waits one second, then two seconds.
It honors provider delays up to 30 seconds. For a longer delay, stop without an early retry and contact the service owner.
Each request also needs a finite transport timeout. These limits bound attempts and waits, not the complete request duration.
Do not retry authentication, TLS, configuration, input, model, or unexpected runtime failures without a corrective action.
When attempts expire, stop the operation. Do not return unchecked text as PII-free. Give the user the safe error message. Give the service owner the code, version, and metadata-only diagnostics. For authentication or TLS failures, contact the credential or certificate owner before another attempt. For repeated connection, timeout, rate-limit, or server failures, contact the remote service owner. For unexpected failures, contact the Privacy maintainer.
| Code | Class | Builtin base | Retryable | Meaning | What to do |
|---|---|---|---|---|---|
GLLM-PRIV-INVALID-INPUT |
InvalidInputError |
ValueError |
No | text or language is missing, empty, or not a string, or no recognizer can detect any of the requested entities. |
Pass a non-empty string. Request entities that the analyzer supports for the language. |
GLLM-PRIV-INVALID-CONFIG |
InvalidConfigError |
ValueError |
No | A configuration value is invalid, such as CHUNK_BATCH_SIZE <= 0, a missing model_path, an mTLS certificate without its key, or a token limit that is too small. |
Fix the parameter named in debug_info["parameter"]. debug_info["reason"] holds the detail when there is one. |
GLLM-PRIV-UNSUPPORTED-LANGUAGE |
UnsupportedLanguageError |
ValueError |
No | The language is not supported by the NLP engine or recognizer. | Use one of the languages listed in the message. |
GLLM-PRIV-UNSUPPORTED-TOKENIZER |
UnsupportedTokenizerError |
ValueError |
No | The tokenizer cannot provide character offsets for chunking. | Read debug_info["reason"]. Use a fast Hugging Face tokenizer. |
GLLM-PRIV-MISSING-DEPENDENCY |
MissingDependencyError |
ImportError |
No | An optional dependency, such as transformers or flair, is not installed. |
Install the matching gllm-privacy extra. |
GLLM-PRIV-MODEL-LOAD |
ModelLoadError |
RuntimeError |
No | The NER tokenizer, model, or pipeline cannot be loaded. | Check the model path and access to the model files. |
GLLM-PRIV-MODEL-INFERENCE |
ModelInferenceError |
RuntimeError |
No | The NER model failed while predicting entities. | Check the model installation and the available memory. |
GLLM-PRIV-MODEL-OUTPUT |
ModelOutputError |
ValueError |
No | The NER model returned results that do not match its input. | Read debug_info["reason"]. Check that the model is a token classification model. |
GLLM-PRIV-RUNTIME |
PrivacyRuntimeError |
RuntimeError |
No | An internal step failed unexpectedly. | Report the code, package version, and metadata-only debug_info to the gllm-privacy maintainers. Do not retry without a corrective action. |
GLLM-PRIV-REMOTE-TIMEOUT |
RemoteRecognizerTimeoutError |
RuntimeError |
Yes | The remote NER service did not respond in time. | Retry later, or increase the timeout. |
GLLM-PRIV-REMOTE-CONNECTION |
RemoteRecognizerConnectionError |
RuntimeError |
Yes | The remote NER service cannot be reached. | Check the URL and network access, then retry. |
GLLM-PRIV-REMOTE-TLS |
RemoteRecognizerTLSError |
RuntimeError |
No | The TLS certificates could not be loaded, or the TLS handshake failed, such as a missing certificate file, a rejected client certificate or an unverifiable server certificate. | Check the client certificate, key, and CA certificate. Do not retry as is. |
GLLM-PRIV-REMOTE-AUTH |
RemoteRecognizerAuthError |
RuntimeError |
No | The service rejected the credentials (HTTP 401 or 403). | Fix the API key or client certificate. Do not retry as is. |
GLLM-PRIV-REMOTE-RATE-LIMIT |
RemoteRecognizerRateLimitError |
RuntimeError |
Yes | The service throttled the request (HTTP 429). | Wait, then retry. |
GLLM-PRIV-REMOTE-SERVER |
RemoteRecognizerServerError |
RuntimeError |
Yes | The service failed on its side (HTTP 5xx). | Retry later. If it keeps failing, contact the service owner. |
GLLM-PRIV-REMOTE-REQUEST |
RemoteRecognizerRequestError |
RuntimeError |
No | The request failed for another reason, such as another HTTP 4xx status. | Check the recognizer configuration. |
GLLM-PRIV-REMOTE-INVALID-RESPONSE |
RemoteRecognizerInvalidResponseError |
RuntimeError |
No | The service returned a response that is not JSON, misses required entity keys, or has an entity without offsets. | Check that the URL points to a compatible NER API. |
Metadata
Release files for gllm-privacy-binary 0.4.38
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 6.8 MB
Release files / gllm_privacy_binary-0.4.38-cp313-cp313-win_amd64.whl
| Download URL | gllm_privacy_binary-0.4.38-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 633.1 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
283f83f1f40fbdbb3dd9c660582160ee317899654695b262f8f717c7181b08cf
|
|
BLAKE2b-256 checksum How to use checksums |
5be8bd3abe53233d16bdfff5d641b1bf04237e2dea75bcefee247f713f8e47de
|
| 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 15, 2026.
Transparency logRelease files / gllm_privacy_binary-0.4.38-cp313-cp313-manylinux_2_31_x86_64.whl
| Download URL | gllm_privacy_binary-0.4.38-cp313-cp313-manylinux_2_31_x86_64.whl |
|---|---|
| Size | 977.8 kB |
| Tags | CPython 3.13 Linux glibc 2.31+ x86-64 |
|
SHA-256 checksum How to use checksums |
1a0cfe2a483819324d7f632bb2c13967f20064882c3631b15134df998524c76b
|
|
BLAKE2b-256 checksum How to use checksums |
342d0d961f32088c7d18e75b5c6cbcadf0ee41649f51c45c66fbe6af622f0e27
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.8.24
|
Release files / gllm_privacy_binary-0.4.38-cp313-cp313-macosx_13_0_arm64.whl
| Download URL | gllm_privacy_binary-0.4.38-cp313-cp313-macosx_13_0_arm64.whl |
|---|---|
| Size | 696.7 kB |
| Tags | CPython 3.13 macOS 13.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7efefe24cc50e30773c9d7bf5484b9fb7467fb58e204bcee10c1c1f0bcddb711
|
|
BLAKE2b-256 checksum How to use checksums |
0f43d4c1ab04291b9fe0b9adc6ff3f3840c0eca731e35fb050caccc3ebe32289
|
| 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 15, 2026.
Transparency logRelease files / gllm_privacy_binary-0.4.38-cp312-cp312-win_amd64.whl
| Download URL | gllm_privacy_binary-0.4.38-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 633.8 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
daa2ae2970713cfa9ce9ca0ffedf4e289a6de4b1909a89c8879922ee44fdcdf2
|
|
BLAKE2b-256 checksum How to use checksums |
62b9c85c13187b33ccc45d172162453fe367b7a4fc89a86f63cb759461f0eef0
|
| 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 15, 2026.
Transparency logRelease files / gllm_privacy_binary-0.4.38-cp312-cp312-manylinux_2_31_x86_64.whl
| Download URL | gllm_privacy_binary-0.4.38-cp312-cp312-manylinux_2_31_x86_64.whl |
|---|---|
| Size | 970.9 kB |
| Tags | CPython 3.12 Linux glibc 2.31+ x86-64 |
|
SHA-256 checksum How to use checksums |
076a053543908682097baad277240a02a182b68682173f86c03ff577a82c6921
|
|
BLAKE2b-256 checksum How to use checksums |
4da09abbd5979aea11555b9db69cc7a86d2a9d67c89e4169348e196ad4d18a9e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.8.24
|
Release files / gllm_privacy_binary-0.4.38-cp312-cp312-macosx_13_0_arm64.whl
| Download URL | gllm_privacy_binary-0.4.38-cp312-cp312-macosx_13_0_arm64.whl |
|---|---|
| Size | 677.3 kB |
| Tags | CPython 3.12 macOS 13.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
6bcbae024059c79525c1b224035069f1142fd489dc42a5bec038a929e1b16b18
|
|
BLAKE2b-256 checksum How to use checksums |
26b960e8a4940c56e0674e40984576a71188fd3dc591799b7e9a48cece05c2c6
|
| 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 15, 2026.
Transparency logRelease files / gllm_privacy_binary-0.4.38-cp311-cp311-win_amd64.whl
| Download URL | gllm_privacy_binary-0.4.38-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 652.9 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
bb7be22d4a086c4887ad9d0473ce85baafe81b5b2f50bc45ca173c729cfd4f27
|
|
BLAKE2b-256 checksum How to use checksums |
a850533379f1fea4076c52efe2dddf2bde08eb6f02efb3fed7161071ed2f183c
|
| 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 15, 2026.
Transparency logRelease files / gllm_privacy_binary-0.4.38-cp311-cp311-manylinux_2_31_x86_64.whl
| Download URL | gllm_privacy_binary-0.4.38-cp311-cp311-manylinux_2_31_x86_64.whl |
|---|---|
| Size | 893.3 kB |
| Tags | CPython 3.11 Linux glibc 2.31+ x86-64 |
|
SHA-256 checksum How to use checksums |
c3b2ab6afc88b8fc49bb7b2b971ee83fdef5d247a751696702d4e8b9353a6b6c
|
|
BLAKE2b-256 checksum How to use checksums |
15037bef8a5d30fdbba4af74fa0990a026c59c8323058fd788ec555326974712
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.8.24
|
Release files / gllm_privacy_binary-0.4.38-cp311-cp311-macosx_13_0_arm64.whl
| Download URL | gllm_privacy_binary-0.4.38-cp311-cp311-macosx_13_0_arm64.whl |
|---|---|
| Size | 664.3 kB |
| Tags | CPython 3.11 macOS 13.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
14a64aacf2453f7fab219db16cc5e1d1b95b521de65fc1aeb6e243f2d32935b0
|
|
BLAKE2b-256 checksum How to use checksums |
e50d1d72a5f9024e88566c6f1f58289b4816b11ef033ec816caa288defc23f63
|
| 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 15, 2026.
Transparency log