improvado-pipeline-sdk
SDK for authoring custom data pipeline workflows on Temporal.
Provides type definitions, helper functions, and constants for building ETL/ELT pipelines that run on Improvado's Temporal infrastructure.
Install
pip install improvado-pipeline-sdk
Usage
Workflow code
import dataclasses
from temporalio import workflow
with workflow.unsafe.imports_passed_through():
from pipeline_sdk.types import (
DataRef,
DateRangeRequest,
DateRangeType,
)
from pipeline_sdk.activities import (
les_extract,
ch_load,
prepare_credentials,
cleanup_credentials,
)
@dataclasses.dataclass(frozen=True)
class MyPipelineParams:
connector_id: int
@workflow.defn(sandboxed=False, name="MyPipeline")
class MyPipelineWorkflow:
@workflow.run
async def run(self, params: MyPipelineParams) -> dict:
result = await les_extract(
connector_id=params.connector_id,
data_source="facebook",
report_type="ad_insights",
date_range=DateRangeRequest(
date_range_type=DateRangeType.MANUAL,
params={"date_from": "2026-01-01", "date_to": "2026-03-31"},
),
)
return {"data_ref": result.data_ref.uri}
Activity code
from temporalio import activity
from pipeline_sdk.runtime import (
load_credentials,
get_current_tenant,
PipelineState,
)
@activity.defn
async def my_activity(creds) -> dict:
tenant = get_current_tenant()
secret = await load_credentials(creds)
# secret.s3, secret.storage, secret.connections
return {"tenant": tenant.agency_uuid}
Worker / client setup
from pipeline_sdk.tenant import (
TenantInterceptor, # worker side
TenantClientInterceptor, # client side
TenantID,
)
Run a workflow locally against production Temporal
For inner-loop debugging — write your workflow on your laptop and run
it against production Temporal under your tenant identity. Activities
defined in your file run on the laptop; cross-queue activities such as
les_extract, ch_load, prepare_credentials are dispatched to
Improvado shared queues and execute on Improvado infra.
pip install improvado-pipeline-sdk
# Mint a Temporal JWT — ask your platform team for the runbook.
export TEMPORAL_API_URL=flow-api.tools.improvado.io:443
export TEMPORAL_AUTH_JWT=$(cat /tmp/temporal-token)
export TENANT_AGENCY_UUID=fc010783-7a09-449b-84ab-0c1660b15245
export TENANT_WORKSPACE_ID=42
# optional: TENANT_USER_ID=99 # ADR-010 user-scope tenants
# optional: TEMPORAL_TLS=false # debug only — local docker-compose
# optional: VAULT_ADDR / VAULT_MOUNT_POINT — point load_credentials at prod
One-shot mode (default) — point at a workflow file, the runner spins up a worker on the tenant queue, starts the workflow, prints the result, and exits:
python -m pipeline_sdk hello_sdk.py
python -m pipeline_sdk hello_sdk.py --params '{"label": "hi"}'
python -m pipeline_sdk ./pipelines/ --name HelloSdkWorkflow --params-file params.json
Worker-only mode — long-running worker that polls the tenant
queue tenant-{agency}-{workspace}[-{user}]. Trigger runs through
Workflow Manager API or Temporal CLI:
python -m pipeline_sdk ./pipelines/ --worker-only
# or use the dedicated entry: improvado-pipeline-run ./pipelines/ --worker-only
Ctrl-C drains and exits in both modes.
Type checking
pyright my_workflow.py
ruff check my_workflow.py
ruff format my_workflow.py
Both pyright and ruff are included as dependencies.
Package structure
| Module | Purpose |
|---|---|
pipeline_sdk.types |
Pure, Temporal-serializable data types and enums — DataRef, TenantID, Cluster, DateRangeRequest, DateRangeType, PipelineCredentials, PipelineSecret, S3Credentials, StorageCredentials, LesActivityWithS3Result, PipelineLoadResult. Safe to import from either workflow or activity code. |
pipeline_sdk.activities |
Predefined workflow-side wrappers — les_extract, ch_load, prepare_credentials, cleanup_credentials. Import inside workflow.unsafe.imports_passed_through(). Custom activities defined in your own module inherit the workflow's task queue — do not pass task_queue to workflow.execute_activity. |
pipeline_sdk.runtime |
Activity-side helpers — load_credentials, PipelineState, get_current_tenant, plus VAULT_ADDR / VAULT_MOUNT_POINT for Vault config overrides. |
pipeline_sdk.tenant |
Tenant propagation infrastructure — TenantInterceptor, TenantClientInterceptor, build_tenant_headers, plus TenantID / get_current_tenant re-exports. |
Metadata
Release files for improvado-pipeline-sdk 0.15.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| improvado_pipeline_sdk-0.15.0.tar.gz | 66.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| improvado_pipeline_sdk-0.15.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 153.9 kB
Release files / improvado_pipeline_sdk-0.15.0.tar.gz
| Download URL | improvado_pipeline_sdk-0.15.0.tar.gz |
|---|---|
| Size | 66.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
91852df486362bec6bd92bbe47d77ecc15b4ea97cfcb81b2cf0cebba0ee0e205
|
|
BLAKE2b-256 checksum How to use checksums |
040a5f91c509ca2a2214b6fa8a77d6a12f3d0b353cefe85cbe17f234b74f3031
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / improvado_pipeline_sdk-0.15.0-py3-none-any.whl
| Download URL | improvado_pipeline_sdk-0.15.0-py3-none-any.whl |
|---|---|
| Size | 87.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
db323a6ea0ff9bc81d2286a500e1abfd47dd88fba27be0c79bfa48d95de1f5ed
|
|
BLAKE2b-256 checksum How to use checksums |
47b6a5c3e4359d37126984e1219440228a6b0dc153d0bc8b0e033dcbb1968d7b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|