Pangram Labs Python Package
Installation
pip install pangram-sdk
Add your API key
Add your API key as an environment variable, or pass it directly to the Pangram constructor.
export PANGRAM_API_KEY=<your API key>
from pangram import Pangram
# If the environment variable PANGRAM_API_KEY is set:
pangram_client = Pangram()
# Otherwise, pass the API key directly:
my_api_key = '' # Fill this in with your API key.
pangram_client = Pangram(api_key=my_api_key)
Discover available models
Model availability is specific to your API key. Use list_models() instead of
hard-coding a model catalog:
available_models = pangram_client.list_models()
print(available_models) # e.g., ["default", "pangram-4"]
The returned list preserves the server's model order and only includes models
that your API key can currently use. The keyword-only model argument on text
and bulk requests is temporarily optional for backward compatibility. Omitting
it selects Pangram's abstract default and emits a DeprecationWarning.
Explicitly pass model="default" or model="pangram-4" in new code. After
September 30, 2026, callers will be required to select a model explicitly.
Make a request
Main prediction method (AI-assistance detection and segment-level analysis):
from pangram import Pangram
pangram_client = Pangram()
result = pangram_client.predict(text, model="pangram-4")
stage = result['stage'] # "STAGE_SUCCESS" after predict() completes.
version = result['version'] # "4.0" for Pangram 4.
# Analysis with AI-assistance detection.
fraction_ai = result['fraction_ai']
fraction_ai_assisted = result['fraction_ai_assisted']
fraction_human = result['fraction_human']
num_ai_segments = result['num_ai_segments']
# Access individual window classifications
for window in result['windows']:
label = window['label'] # "AI-Generated", "AI-Assisted", or "Human Written"
ai_assistance_score = window['ai_assistance_score']
confidence = window['confidence'] # A string: "High", "Medium", or "Low"
is_humanized = window['is_humanized']
humanizer_score = window['humanizer_score'] # 0.0-1.0
predict() submits to Pangram's async inference API and waits for the result before returning.
Use predict(text, model="pangram-4", public_dashboard_link=True) or
predict_with_dashboard_link(text, model="pangram-4", timeout=300, poll_interval=0.5) to include a dashboard_link in the completed result.
Pangram 4 returns version == "4.0". Every Pangram 4 window includes
is_humanized and humanizer_score. Pangram 4 uses the single
"AI-Assisted" window label rather than lightly/moderately assisted variants,
and confidence remains a string.
Results remain normal dictionaries. For typed applications, the package
exports PredictionResult, PredictionWindow, BulkResultsPage, and
BulkResults TypedDict contracts.
Upload files
Use predict_file() or predict_files() when you want Pangram to extract text
from .docx, .pdf, or .rtf documents and create AI detection results.
Each result includes the extracted text, prediction fields, window-level
analysis, and the uploaded filename. Set public_dashboard_link=True to
include a dashboard_link.
File prediction currently uses Pangram's default model only.
predict_file() and predict_files() do not accept model.
from pangram import Pangram
pangram_client = Pangram()
result = pangram_client.predict_file(
"path/to/document.docx",
public_dashboard_link=True,
)
print(result["dashboard_link"])
print(result["prediction_short"])
print(result["filename"])
To upload multiple files in one request:
results = pangram_client.predict_files(
["path/to/first.docx", "path/to/second.pdf"],
public_dashboard_link=True,
)
for result in results:
print(result["dashboard_link"])
Submit a Bulk API job
Use the Bulk API for asynchronous AI detection across many inputs.
Submit either a list of strings with text or a list of objects with items.
Item id values are optional customer IDs that are returned with item status
and results.
Bulk jobs are processed asynchronously. Completion time depends on the number
and length of submitted items and current system load. Use get_bulk_status()
or wait_for_bulk() to monitor progress.
from pangram import Pangram
pangram_client = Pangram()
bulk = pangram_client.submit_bulk(
items=[
{"id": "row-001", "text": "First text to analyze"},
{"id": "row-002", "text": "Second text to analyze"},
],
model="pangram-4",
)
bulk_id = bulk["bulk_id"]
status = pangram_client.wait_for_bulk(bulk_id, poll_interval=2)
results = pangram_client.get_bulk_results(bulk_id)
for item in results["items"]:
if item["result"] is not None:
print(item["id"], item["result"]["prediction_short"])
for failed in results["failed_items"]:
print(failed["id"], failed["error"])
model is keyword-only and applies to the entire bulk job. During the
compatibility period, omitting it selects "default" and emits a
DeprecationWarning; after September 30, 2026, it will be required. Per-item
model selectors are not supported. Successful Pangram 4 item results use the
same version 4.0 and window schema described above.
Bulk jobs can also be inspected without waiting:
status = pangram_client.get_bulk_status(bulk_id)
items = pangram_client.get_bulk_items(bulk_id, offset=0, limit=100)
results_page = pangram_client.get_bulk_results_page(bulk_id, offset=0, limit=100)
For large jobs, use get_bulk_results_page() in a loop instead of get_bulk_results()
to process one page at a time without holding the full result set in memory:
offset = 0
limit = 1000
while True:
page = pangram_client.get_bulk_results_page(bulk_id, offset=offset, limit=limit)
for item in page["items"]:
process(item)
for failed in page["failed_items"]:
handle_failure(failed)
offset += limit
if offset >= page["total_items"]:
break
Building Documentation
Install docs dependencies and build:
poetry install --with docs
cd docs && make html
Questions? Email support@pangram.com!
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pangram_sdk-1.0.0.tar.gz.
File metadata
- Download URL: pangram_sdk-1.0.0.tar.gz
- Upload date:
- Size: 13.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb20ff297620cfb6041feaaac5deba177eea3f7695cabd2de845f422a8ab33af
|
|
| MD5 |
e3d9cd41a4e0ea82ced188a0fddd8335
|
|
| BLAKE2b-256 |
10944e78df78954d82fca0287b470ac702b49cef224362a4350117c9e232e97e
|
Provenance
The following attestation bundles were made for pangram_sdk-1.0.0.tar.gz:
Publisher:
publish-to-pypi.yml on pangramlabs/pangram-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pangram_sdk-1.0.0.tar.gz -
Subject digest:
bb20ff297620cfb6041feaaac5deba177eea3f7695cabd2de845f422a8ab33af - Sigstore transparency entry: 2281146581
- Sigstore integration time:
-
Permalink:
pangramlabs/pangram-sdk@ca42297609e65b1474be168901168ef4ed7a2950 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/pangramlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@ca42297609e65b1474be168901168ef4ed7a2950 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pangram_sdk-1.0.0-py3-none-any.whl.
File metadata
- Download URL: pangram_sdk-1.0.0-py3-none-any.whl
- Upload date:
- Size: 13.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0743c8fa13e0dbefc0375755e13e9bc4e7b91934e1f3db0407b8cbcee563b842
|
|
| MD5 |
1d87345551973070b74486e747d29e7e
|
|
| BLAKE2b-256 |
5cffe3fafd04ad703f0dfc727d36e5f71aaa52aa7777ee886a8173741e3fbfa1
|
Provenance
The following attestation bundles were made for pangram_sdk-1.0.0-py3-none-any.whl:
Publisher:
publish-to-pypi.yml on pangramlabs/pangram-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pangram_sdk-1.0.0-py3-none-any.whl -
Subject digest:
0743c8fa13e0dbefc0375755e13e9bc4e7b91934e1f3db0407b8cbcee563b842 - Sigstore transparency entry: 2281146600
- Sigstore integration time:
-
Permalink:
pangramlabs/pangram-sdk@ca42297609e65b1474be168901168ef4ed7a2950 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/pangramlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@ca42297609e65b1474be168901168ef4ed7a2950 -
Trigger Event:
push
-
Statement type: