Skip to main content

GLLM Privacy

Description

A library to protect Personal Identifiable Information (PII) in a Generative AI project.

Installation

Prerequisites

Mandatory:

  1. Python 3.11+ — Install here
  2. pip — Install here
  3. uv — Install here

Extras (required only for Artifact Registry installations):

  1. 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

  1. Python 3.11+ — Install here

  2. pip — Install here

  3. uv — Install here

  4. gcloud CLI — Install here, then log in using:

    gcloud auth login
    
  5. Git — Install here

  6. 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, default None): 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 example 512 for 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 retrying can succeed. str(error) returns only the message. debug_info never holds the analyzed text, request payloads, response bodies, headers, or URL query strings.

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. debug_info["reason"] holds the internal cause when no original error was caught.

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})
    if error.recovery["retryable"]:
        # Wait for error.recovery.get("retry_after_seconds", <your backoff>), then retry with your own limits.
        ...
    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) raise a BaseRemoteRecognizerError subclass when the call fails or the response has an unexpected format, including an entity without offsets. FlairRecognizer raises ModelInferenceError when its model fails. None of them return an empty result in place of a failure.

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 Retry-After header. How many times to retry, and the backoff between attempts, is up to the caller.

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. Read debug_info["reason"], then report it to the gllm-privacy maintainers.
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.37

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for gllm-privacy-binary 0.4.37
File
gllm_privacy_binary-0.4.37-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
gllm_privacy_binary-0.4.37-cp313-cp313-manylinux_2_31_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.31+ x86-64 Details
gllm_privacy_binary-0.4.37-cp313-cp313-macosx_13_0_arm64.whl CPython 3.13 CPython 3.13 macOS 13.0+ ARM64 Details
gllm_privacy_binary-0.4.37-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
gllm_privacy_binary-0.4.37-cp312-cp312-manylinux_2_31_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.31+ x86-64 Details
gllm_privacy_binary-0.4.37-cp312-cp312-macosx_13_0_arm64.whl CPython 3.12 CPython 3.12 macOS 13.0+ ARM64 Details
gllm_privacy_binary-0.4.37-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
gllm_privacy_binary-0.4.37-cp311-cp311-manylinux_2_31_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.31+ x86-64 Details
gllm_privacy_binary-0.4.37-cp311-cp311-macosx_13_0_arm64.whl CPython 3.11 CPython 3.11 macOS 13.0+ ARM64 Details

Total release size: 6.7 MB

Release files / gllm_privacy_binary-0.4.37-cp313-cp313-win_amd64.whl

Download URL gllm_privacy_binary-0.4.37-cp313-cp313-win_amd64.whl
Size 624.2 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
f46636d0eff48a4aeed787a551704d7061638b56571227f2f063d241eb59f2aa
BLAKE2b-256 checksum
How to use checksums
43f81050b697ed9006603bdf6312364170acfad8d79aeb4a6cbe1238ff66d0fc
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 13, 2026.

Transparency log

Release files / gllm_privacy_binary-0.4.37-cp313-cp313-manylinux_2_31_x86_64.whl

Download URL gllm_privacy_binary-0.4.37-cp313-cp313-manylinux_2_31_x86_64.whl
Size 965.6 kB
Tags CPython 3.13 Linux glibc 2.31+ x86-64
SHA-256 checksum
How to use checksums
e1bd8e6dddbd30452b93da2f582838595a14b3951d4255dda9325d6c874b1cc5
BLAKE2b-256 checksum
How to use checksums
8f8c4b3c8fea9c68a4d2ab4c9c43b8b8f7bbe70c4db364c4eeb2eb726dc6ee9b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.8.24

Release files / gllm_privacy_binary-0.4.37-cp313-cp313-macosx_13_0_arm64.whl

Download URL gllm_privacy_binary-0.4.37-cp313-cp313-macosx_13_0_arm64.whl
Size 689.1 kB
Tags CPython 3.13 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
fc71c5dcdd09d138076ed114cba554ff31c5e15da54b6785fa54fb9bc09f7c6a
BLAKE2b-256 checksum
How to use checksums
37ffb448c311e85defaa1ab1c155aefabb5c8229e205dd251927277d9b89c976
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 13, 2026.

Transparency log

Release files / gllm_privacy_binary-0.4.37-cp312-cp312-win_amd64.whl

Download URL gllm_privacy_binary-0.4.37-cp312-cp312-win_amd64.whl
Size 624.7 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
1d3302a4ea812ddb051b0d141862cf53546c66ec60bfc89b0734b5da2e64a819
BLAKE2b-256 checksum
How to use checksums
82e6c87b0200eff4cc1f6158362030c9bf5ce5ea9ead8e721df92f28b42be265
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 13, 2026.

Transparency log

Release files / gllm_privacy_binary-0.4.37-cp312-cp312-manylinux_2_31_x86_64.whl

Download URL gllm_privacy_binary-0.4.37-cp312-cp312-manylinux_2_31_x86_64.whl
Size 958.2 kB
Tags CPython 3.12 Linux glibc 2.31+ x86-64
SHA-256 checksum
How to use checksums
bdcd0e5ee6226027566ff932a455da26efb774144925fa062186035f8dbd5899
BLAKE2b-256 checksum
How to use checksums
70bbc0146e8cd185727dc88ec87b291d172d23d7ebdfd3dd2f82860f2761b255
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.8.24

Release files / gllm_privacy_binary-0.4.37-cp312-cp312-macosx_13_0_arm64.whl

Download URL gllm_privacy_binary-0.4.37-cp312-cp312-macosx_13_0_arm64.whl
Size 670.4 kB
Tags CPython 3.12 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
275b7e455c98fd48d329578733ea340d331f38eb255937aa480a400317e7cf68
BLAKE2b-256 checksum
How to use checksums
3e280dc1c61a599556e5d349d85ed9d02a3e1f449f8d8524c1e518eaf318c282
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 13, 2026.

Transparency log

Release files / gllm_privacy_binary-0.4.37-cp311-cp311-win_amd64.whl

Download URL gllm_privacy_binary-0.4.37-cp311-cp311-win_amd64.whl
Size 645.3 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
79c1c394f35ef7291ba889875796ca1002243047f3f3ce8bd06ad89cf1cd27ea
BLAKE2b-256 checksum
How to use checksums
ff23034826378ff786a67d7dea9821cd1d2cf6bc35597aef687a726a00933e38
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 13, 2026.

Transparency log

Release files / gllm_privacy_binary-0.4.37-cp311-cp311-manylinux_2_31_x86_64.whl

Download URL gllm_privacy_binary-0.4.37-cp311-cp311-manylinux_2_31_x86_64.whl
Size 877.3 kB
Tags CPython 3.11 Linux glibc 2.31+ x86-64
SHA-256 checksum
How to use checksums
bb9852b58908e4fb9b385e6f5f7e62473e5a396ad3c9614552e4216824bd9264
BLAKE2b-256 checksum
How to use checksums
defc0cd63927a1cab818b6739ad12cdf0befe63e34611fdc011b391d4048b67d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.8.24

Release files / gllm_privacy_binary-0.4.37-cp311-cp311-macosx_13_0_arm64.whl

Download URL gllm_privacy_binary-0.4.37-cp311-cp311-macosx_13_0_arm64.whl
Size 655.3 kB
Tags CPython 3.11 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
6115a924da035d4ba131f023f68c2e255b99c30b0157ecfa2973fb926f88609a
BLAKE2b-256 checksum
How to use checksums
ffe26799875138c05da8972f55b15e11e5325262f06e150977b8503b712990dc
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 13, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page