Python SDK for the Trelent Data Ingestion API
Project description
Data Ingestion Python SDK
Overview
- Endpoints:
GET /healthz,GET /v1/jobs/,POST /v1/jobs/,GET /v1/jobs/{id},PUT /v1/files/,GET /v1/files/,POST /v1/token/generate,GET /v1/token/list,POST /v1/token/revoke - Models: All requests/responses are strict Pydantic models
- Auth: Bearer token required
- Python: 3.9+
Install
From PyPI:
pip install trelent-data-ingestion
From source (editable):
pip install -e ./sdk/python
Configuration
Provide a base URL and bearer token via environment variables or explicitly.
If you instantiate DataIngestionClient() without arguments, these environment variables are required:
DATA_INGESTION_API_URLorDATA_INGESTION_API_BASE_URLDATA_INGESTION_API_TOKEN
If you pass credentials explicitly, the environment variables are not needed:
from trelent_data_ingestion_sdk import SDKConfig, DataIngestionClient
# Option 1: From environment (raises ValueError if vars are missing)
client = DataIngestionClient()
# Option 2: Explicit config (no env vars needed)
cfg = SDKConfig(base_url="https://api.example.com", token="<bearer>")
client = DataIngestionClient(cfg)
# Option 3: Direct arguments (no env vars needed)
client = DataIngestionClient(base_url="https://api.example.com", token="<bearer>")
Quickstart
from trelent_data_ingestion_sdk import (
DataIngestionClient,
S3Connector,
S3SignedUrlOutput,
JobInput,
)
with DataIngestionClient() as client:
# Health check
print(client.healthz())
# Submit a job using S3
job = JobInput(
connector=S3Connector(
bucket_name="my-bucket",
prefixes=["docs/a.pdf", "docs/b.pdf"],
),
output=S3SignedUrlOutput(expires_minutes=60),
)
resp = client.submit_job(job)
print("submitted:", resp.job_id)
# Poll status
status = client.get_job_status(resp.job_id, include_markdown=True)
print(status.status)
If you need to override the environment at runtime:
# Via config object
cfg = SDKConfig(base_url="https://api.example.com", token="<bearer>")
client = DataIngestionClient(cfg)
# Or directly
client = DataIngestionClient(base_url="https://api.example.com", token="<bearer>")
Connectors
S3Connector: Process files from S3bucket_name: strprefixes: list[str | S3Prefix]- prefixes to search (recursive by default)
UrlConnector: Process files from URLsurls: list[str]
FileUploadConnector: Process files uploaded via/v1/files/file_ids: list[UUID]
String prefixes are searched recursively by default. Use S3Prefix to disable recursive searching:
from trelent_data_ingestion_sdk.models import S3Prefix, S3Connector
connector = S3Connector(
bucket_name="my-bucket",
prefixes=[
"reports/2024/", # Recursive (default)
S3Prefix(prefix="logs/", recursive=False), # Non-recursive
],
)
Outputs
S3SignedUrlOutput: Get presigned URLs for resultsexpires_minutes: int(default 1440)
BucketOutput: Write results to an S3 bucketbucket_name: strprefix: str
API Methods
| Method | Description |
|---|---|
client.healthz() |
Check API health |
client.submit_job(JobInput) |
Submit a processing job |
client.list_jobs() |
List jobs created by the authenticated user |
client.get_job_status(job_id, include_markdown=False, include_file_metadata=False) |
Get job status and results |
client.upload_file(file_data, filename, content_type, expires_in_days) |
Upload a file for processing |
client.list_files() |
List uploaded files |
client.generate_token(GenerateTokenRequest) |
Generate a scoped JWT token |
client.list_tokens(ListTokensParams) |
List tokens with optional filters |
client.revoke_token(RevokeTokenRequest) |
Revoke a token by ID |
Token Generation
Generate scoped JWT tokens for delegated access:
from trelent_data_ingestion_sdk import (
DataIngestionClient,
GenerateTokenRequest,
TokenPermission,
)
with DataIngestionClient() as client:
req = GenerateTokenRequest(
subject="user@example.com",
permissions={TokenPermission.WORKFLOW_DOCUMENT, TokenPermission.FILE_UPLOAD},
expires_seconds=3600,
)
resp = client.generate_token(req)
print(resp.token)
Available permissions:
TokenPermission.WORKFLOW_ADMIN- Full workflow accessTokenPermission.WORKFLOW_VIDEO- Process video filesTokenPermission.WORKFLOW_DOCUMENT- Process documentsTokenPermission.FILE_ADMIN- Full file accessTokenPermission.FILE_LIST- List uploaded filesTokenPermission.FILE_UPLOAD- Upload filesTokenPermission.TOKEN_LIST- List tokensTokenPermission.TOKEN_REVOKE- Revoke tokens
File Upload
Upload files directly for processing:
from trelent_data_ingestion_sdk import DataIngestionClient, FileUploadConnector, JobInput, S3SignedUrlOutput
with DataIngestionClient() as client:
# Upload a file
with open("document.pdf", "rb") as f:
upload = client.upload_file(f.read(), "document.pdf", "application/pdf")
# Process the uploaded file
job = JobInput(
connector=FileUploadConnector(file_ids=[upload.id]),
output=S3SignedUrlOutput(expires_minutes=60),
)
resp = client.submit_job(job)
Markdown Fragmentation
Split large markdown documents into smaller chunks for embedding or processing:
from trelent_data_ingestion_sdk import fragment_markdown, MAX_FRAGMENT_CHARS
fragments = fragment_markdown(markdown_content)
# Or with custom size
fragments = fragment_markdown(markdown_content, max_fragment_chars=10000)
Delivery Payloads
When status is Completed, JobStatusResponse.delivery maps input identifiers to delivery items:
Signed URLs:
status = client.get_job_status(job_id, include_markdown=True)
for key, item in status.delivery.items():
print(f"{key}: {item.markdown_delivery.url}")
print(f"Markdown: {item.markdown}")
Bucket pointers:
for key, item in status.delivery.items():
print(f"{key}: s3://{item.markdown_delivery.bucket_name}/{item.markdown_delivery.object_key}")
Error Handling
- Config validation:
ValueErrorif missingbase_urlortoken - HTTP errors:
requests.HTTPErroron non-2xx responses - Parsing:
pydantic.ValidationErroron invalid payloads
Development
Build locally:
uv build --directory sdk/python
Run tests across Python versions:
uvx tox
Bump version:
uv version --bump patch --directory sdk/python --no-sync
Publish via the repo's GitHub Action (PyPI Trusted Publisher).
Project details
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 trelent_data_ingestion-0.2.0.tar.gz.
File metadata
- Download URL: trelent_data_ingestion-0.2.0.tar.gz
- Upload date:
- Size: 12.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.2 {"installer":{"name":"uv","version":"0.10.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf7d46aa7ed2504414fb4f2355b7dfa24900449d966543616dcc4a6073bcb44f
|
|
| MD5 |
6523216c1959b9d8ef1da3af20836e59
|
|
| BLAKE2b-256 |
e869804509c68bab0d6424659230d368f818b452f30e9816b9c347e4ea213fee
|
File details
Details for the file trelent_data_ingestion-0.2.0-py3-none-any.whl.
File metadata
- Download URL: trelent_data_ingestion-0.2.0-py3-none-any.whl
- Upload date:
- Size: 14.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.2 {"installer":{"name":"uv","version":"0.10.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
608066a4a9af7f109dc55ab8aaa8aca024613471a7a858bb6fa4b3f658cae362
|
|
| MD5 |
a3fc0066a13432a25cd08693d913faf3
|
|
| BLAKE2b-256 |
85e49f6aff12d03598c21b5acbb15ed7e4fd944a1cb43835a4c636d3aefd8d76
|