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 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)

Table of built distributions (wheels) for gllm-privacy-binary 0.4.38
File
gllm_privacy_binary-0.4.38-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
gllm_privacy_binary-0.4.38-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.38-cp313-cp313-macosx_13_0_arm64.whl CPython 3.13 CPython 3.13 macOS 13.0+ ARM64 Details
gllm_privacy_binary-0.4.38-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
gllm_privacy_binary-0.4.38-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.38-cp312-cp312-macosx_13_0_arm64.whl CPython 3.12 CPython 3.12 macOS 13.0+ ARM64 Details
gllm_privacy_binary-0.4.38-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
gllm_privacy_binary-0.4.38-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.38-cp311-cp311-macosx_13_0_arm64.whl CPython 3.11 CPython 3.11 macOS 13.0+ ARM64 Details

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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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
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