Skip to main content

Agora — async-first ETL framework for Python.

Project description

Agora ETL

Async-first ETL framework for Python.

License Python PyPI

agora-etl is the core Agora runtime: a builder-first ETL framework organized around a Source → Middleware chain → Sink(s) model.

The core package owns runtime semantics, public contracts, CLI diagnostics, checkpointing, DLQ behavior, scheduling primitives, health/metrics surfaces, and plugin discovery. Backend integrations such as Redis, Kafka, PostgreSQL, cron scheduling, distributed coordination, and Anthropic live in the official agora-etl-plugins package.

Keep the package story simple:

  • agora-etl owns runtime semantics and public framework contracts
  • agora-etl-plugins owns official backend implementations and backend runbooks
  • agora-etl-rs accelerates selected hot paths through the core acceleration boundary

Install

pip install agora-etl

Optional core extras:

pip install "agora-etl[file]"       # pyarrow + faster JSONL/file paths
pip install "agora-etl[rs]"         # optional Rust acceleration boundary
pip install "agora-etl[benchmark]"  # local benchmarking helpers

Official integrations:

pip install "agora-etl-plugins[redis]"
pip install "agora-etl-plugins[kafka]"
pip install "agora-etl-plugins[postgres]"
pip install "agora-etl-plugins[all]"

agora-etl-plugins 0.4.x targets agora-etl>=0.4.1,<1.

Quickstart

import asyncio

from agora import DeliveryConfig, IterableSource, Pipeline
from agora.core.dlq import SQLiteDLQSink


records = [
    {"id": 1, "city": "Ho Chi Minh City", "confidence": 0.92},
    {"id": 2, "city": "Da Nang", "confidence": 0.41},
    {"id": 3, "city": "Hanoi", "confidence": 0.88},
]


async def main() -> None:
    summary = await (
        Pipeline(IterableSource(records))
        .filter(lambda row: row["confidence"] >= 0.5, name="confidence_gate")
        .build(
            config=DeliveryConfig(
                dlq=SQLiteDLQSink(".agora_dlq.db"),
                batch_size=100,
            ),
        )
        .run()
    )
    print(summary)


asyncio.run(main())

build() without an explicit sink uses the default stdout sink. The example:

  • emits in-memory records
  • filters low-confidence rows
  • writes accepted records to stdout
  • routes failed records to a local SQLite DLQ
  • returns a PipelineRunSummary with counts, timing, and runtime signals

Core capabilities

Area What core provides
Pipeline builder Immutable Pipeline, BoundPipeline, .pipe(), .build(), .fan_out(), .route(), and .explain().
Runtime lanes Linear, buffered, Python batch, and Arrow batch execution with one shared data-plane vocabulary.
Reliability Checkpoint stores, DLQ sinks, replay semantics, retry policies, sink failure policies, and conservative checkpoint advancement.
Workers Schedule, ScheduledPipeline, WorkerPool, graceful shutdown, health endpoints, and distributed-coordination hooks.
Observability Run summaries, runtime metrics, tracing, Prometheus rendering helpers, health snapshots, and doctor diagnostics.
Extensibility Public plugin entry-point groups, manifest compatibility diagnostics, registries, and stable core facades.
AI runtime support Provider contracts, AI middleware, cache contracts, budget/cost governance, and provider capability guards.

Runtime guarantees

Agora's public runtime contract is documented in Runtime Guarantees. The high-level model:

  • source order is preserved at the sink boundary
  • checkpoint advancement waits for handled outcomes
  • sink delivery is fail-closed by default
  • DLQ replay acknowledges only after durable replay success
  • batch, Arrow, and process-isolated paths keep the same correctness contract
  • at-least-once delivery is the model; exactly-once behavior requires external idempotency or transactional systems

Execution lanes and data planes

Agora selects the execution lane from explicit source, middleware, and sink contracts:

  • python_rows
  • python_batches
  • arrow_batches

Use .explain() before a run to inspect lane selection and sink downgrade decisions:

from agora import Pipeline
from agora.sinks.file.csv import CsvSink


bound = Pipeline(source).build(CsvSink(path="out.csv", row_mapper=lambda row: row))
plan = bound.explain(max_records=1_000)

print(plan)
print(plan.to_dict())

PipelineExplain includes the selected lane, source data plane, writer input plane, middleware compatibility, sink plane, and downgrade markers.

Core vs plugins

Keep the package boundary clear:

Package Owns
agora-etl Runtime semantics, public contracts, CLI, docs, health, metrics, checkpointing, DLQ behavior, and plugin discovery.
agora-etl-plugins Official Redis, Kafka, PostgreSQL, cron, distributed coordination, Anthropic, backend DLQ, and backend-specific observability surfaces.
agora-etl-rs Optional acceleration primitives selected through the core acceleration boundary.

If a capability depends on Redis, Kafka, PostgreSQL, cron parsing, distributed lease ownership, or a hosted AI provider, it belongs in a plugin package rather than core.

CLI

The package installs the agora command:

agora --help
agora doctor
agora plugins list
agora dlq replay --help

Use agora doctor and agora plugins list --json in release gates and operator diagnostics when installed package behavior matters.

Documentation map

Reference sections:

Development

python -m venv .venv
.venv/bin/pip install -e ".[file,dev,benchmark]"
make ci

Useful focused checks:

make docs-check
make test-core
make contracts
make preservation

The GitHub CI matrix runs on Python 3.11, 3.12, and 3.13.

Security

Security reporting instructions live in SECURITY.md. Do not include exploitable details, credentials, payloads, production hostnames, or private stack traces in public issues.

License

Apache 2.0 — see LICENSE.

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

agora_etl-0.4.4.tar.gz (557.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agora_etl-0.4.4-py3-none-any.whl (367.2 kB view details)

Uploaded Python 3

File details

Details for the file agora_etl-0.4.4.tar.gz.

File metadata

  • Download URL: agora_etl-0.4.4.tar.gz
  • Upload date:
  • Size: 557.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for agora_etl-0.4.4.tar.gz
Algorithm Hash digest
SHA256 a09cf7f4b15bbbb44ce70cda54f7bdb9d8d932741a6adab209274b4f01ee0e46
MD5 b4d5842cae2a453c72689ada983c87ee
BLAKE2b-256 dd0ff4e61b0c33e5a34bd71cfed3c2faa3cd8fdd33d55bd35d1f621d8401029f

See more details on using hashes here.

Provenance

The following attestation bundles were made for agora_etl-0.4.4.tar.gz:

Publisher: release.yml on thanhtham010891/agora-etl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file agora_etl-0.4.4-py3-none-any.whl.

File metadata

  • Download URL: agora_etl-0.4.4-py3-none-any.whl
  • Upload date:
  • Size: 367.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for agora_etl-0.4.4-py3-none-any.whl
Algorithm Hash digest
SHA256 46a7f94344fec808f9f010f1d5ef1719654007d5c06350e695609939e67d12f6
MD5 da5e2dd29c5dee148364c0f6a35b16a6
BLAKE2b-256 0f798f42d97e031e03da2f9f72a13b68167ed73b7256574ffd10d860980d97b3

See more details on using hashes here.

Provenance

The following attestation bundles were made for agora_etl-0.4.4-py3-none-any.whl:

Publisher: release.yml on thanhtham010891/agora-etl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page