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.

When a GDP Labs NER API call fails with an HTTP status, debug_info also holds upstream_error_code (the public code of the NER API error response, such as INVALID_ENTITY_TYPE) and upstream_request_id (its request_id). Use the request ID to find the NER API log record. Each field is present only when the response has the {"error": {...}} envelope and the value has the expected format: an upper-case code of up to 64 characters, or a UUID.

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

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.39
File
gllm_privacy_binary-0.4.39-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
gllm_privacy_binary-0.4.39-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.39-cp313-cp313-macosx_13_0_arm64.whl CPython 3.13 CPython 3.13 macOS 13.0+ ARM64 Details
gllm_privacy_binary-0.4.39-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
gllm_privacy_binary-0.4.39-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.39-cp312-cp312-macosx_13_0_arm64.whl CPython 3.12 CPython 3.12 macOS 13.0+ ARM64 Details
gllm_privacy_binary-0.4.39-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
gllm_privacy_binary-0.4.39-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.39-cp311-cp311-macosx_13_0_arm64.whl CPython 3.11 CPython 3.11 macOS 13.0+ ARM64 Details

Total release size: 6.9 MB

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

Download URL gllm_privacy_binary-0.4.39-cp313-cp313-win_amd64.whl
Size 638.9 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
c4c28c1464c80e93c447db59d0959b96557dfc1271855ec545053c1eca801281
BLAKE2b-256 checksum
How to use checksums
157f98bc2a406a0afcc47368541b060e08bf593dcdd1fcf5809d55b57aad50ef
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 16, 2026.

Transparency log

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

Download URL gllm_privacy_binary-0.4.39-cp313-cp313-manylinux_2_31_x86_64.whl
Size 985.8 kB
Tags CPython 3.13 Linux glibc 2.31+ x86-64
SHA-256 checksum
How to use checksums
0e3a39933047b83dab9ac9f70f6b4c8770568699a1f3e299710c0752621ac1f5
BLAKE2b-256 checksum
How to use checksums
9a8aa4d5baf57e4ca466fd0022c3ca975c38cf8867f8952bbbf53e7e6fe42212
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.8.24

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

Download URL gllm_privacy_binary-0.4.39-cp313-cp313-macosx_13_0_arm64.whl
Size 701.1 kB
Tags CPython 3.13 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
aca708b3b603b002173fbcb02a593f30159288246c12226674ec19b8f44af24b
BLAKE2b-256 checksum
How to use checksums
2926d7208fdef90848b143c61100118c9dadb06c87f14a40f810fb5981c7fc9f
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 16, 2026.

Transparency log

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

Download URL gllm_privacy_binary-0.4.39-cp312-cp312-win_amd64.whl
Size 639.5 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
5b1539bcd5942ce3304e2c53a1464609552979d640203b754b5fb345f60fda92
BLAKE2b-256 checksum
How to use checksums
1697dad0bd2ebaac82d4b87d039ea6d818bb6f58e605982a6d18b122402cf9e4
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 16, 2026.

Transparency log

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

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

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

Download URL gllm_privacy_binary-0.4.39-cp312-cp312-macosx_13_0_arm64.whl
Size 683.4 kB
Tags CPython 3.12 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
65462d615d85f8e4c70e2907d058be44b465d5678c98975e0717df2bdc58c990
BLAKE2b-256 checksum
How to use checksums
05bf9ffbf39e1e9e1b80afe5b559046008b40beb0e3c4138a608b1e067b17928
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 16, 2026.

Transparency log

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

Download URL gllm_privacy_binary-0.4.39-cp311-cp311-win_amd64.whl
Size 657.9 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
36640b5c649d577521cc596bc6e9f757b49c00ae6f904082b7e33d61fc170db7
BLAKE2b-256 checksum
How to use checksums
be90a82420fd675dcb8725fa04573c29b3dbb140ec7e1d81b266d9829d25d67f
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 16, 2026.

Transparency log

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

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

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

Download URL gllm_privacy_binary-0.4.39-cp311-cp311-macosx_13_0_arm64.whl
Size 670.3 kB
Tags CPython 3.11 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
480233b32350bdabb32d315dc7c7cdf0c80ab5dcff74fa5c2e2e2ce9ebc164ec
BLAKE2b-256 checksum
How to use checksums
e86228d0a9856189bfad1e553050bfb974cb0a79373c821fbe480d17dd027703
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 16, 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