Catalog PyPI
PACKAGE EXPLORERView in registry

aaiclick

PyPI

Data orchestration framework on ClickHouse: plain-Python pipelines, dynamic task graphs, containerized runs, lineage over MCP

analyticsbigclickhousedatalineagemcporchestrationpipelineprocessing
Versions collected1
Direct dependencies30From release 0.0.28
Last observed20 Oct, 16:56 UTC

README

Version 0.0.28 documentation
aaiclick logo

aaiclick

aaiclick is a data orchestration framework built to make distributed computing easy, with five principles in mind:

  1. Simplicity — Plain Python, no SQL. Decorate functions into tasks and jobs, run with zero setup on your laptop, scale out unchanged.
  2. Dynamic Graphs — Tasks spawn tasks. The pipeline shapes itself to the data while it runs instead of being declared up front.
  3. Performance — Data lives and computes in ClickHouse. Python only orchestrates; nothing is shuffled through Python memory.
  4. Containerized Runs — Pin a container image, by tag or git SHA, per job or per task. Host and container tasks mix in one pipeline.
  5. Lineage over MCP — Every operation is recorded. Your coding agent (Claude Code, Codex, any MCP client) answers "how did this value get here?" straight from the lineage.

Early stage — looking for early adopters to join the ride and provide feedback.

Installation

The base install includes embedded chdb and SQLite — no external servers needed:

pip install aaiclick
python -m aaiclick setup

For a distributed deployment (remote ClickHouse server + PostgreSQL):

pip install "aaiclick[distributed]"

For lineage triage with your coding agent (Claude Code, Codex, any MCP client):

pip install "aaiclick[server]"   # or all extras: pip install "aaiclick[all]"
python -m aaiclick local start   # REST + MCP server on http://127.0.0.1:5255

Then point the agent at http://127.0.0.1:5255/mcp — see the Lineage guide.

Orchestration

Define tasks and jobs with decorators — all data operations execute as ClickHouse queries:

from aaiclick import create_object_from_value
from aaiclick.orchestration import job, task

@task
async def load_sales():
    return await create_object_from_value({
        "region": ["US", "EU", "US", "EU", "US"],
        "amount": [500, 300, 150, 200, 80],
    })

@task
async def analyze(sales) -> dict:
    # GROUP BY + SUM runs as a single ClickHouse query; return a plain dict
    by_region = await sales.group_by("region").sum("amount")
    return await by_region.data()  # → {'region': ['US', 'EU'], 'amount': [730, 500]}

@task
async def report(summary: dict):
    # receives the plain Python dict returned by analyze()
    print(f"Regions: {summary['region']}")  # → Regions: ['US', 'EU']
    print(f"Amounts: {summary['amount']}")  # → Amounts: [730, 500]
    print(f"Total:   {sum(summary['amount'])}")  # → Total: 1230

@job("sales_pipeline")
def sales_pipeline():
    sales = load_sales()                # a Task, not data — nothing runs yet
    summary = analyze(sales=sales)      # gets the sales task's return value at runtime
    return report(summary=summary)      # the dict flows to report()

if __name__ == "__main__":
    from aaiclick.orchestration import job_test
    job_test(sales_pipeline)  # runs all tasks locally for debugging
python sales_pipeline.py

Data Operation Only Mode

Use data_context() directly for interactive work without orchestration. Decorate an async function to wrap its whole body in a context:

import asyncio
from aaiclick import create_object_from_value
from aaiclick.data.data_context import data_context

@data_context()
async def main():
    prices = await create_object_from_value([10.0, 20.0, 30.0])

    total = prices * 1.1                         # LazyOperator — no DB call yet
    print(await total.data())                    # → [11.0, 22.0, 33.0]
    print(await total.mean().data())             # → 22.0

asyncio.run(main())

data_context() also works as an async with block when you only need part of a function inside the context.

Documentation

aaiclick.readthedocs.io

License

MIT License - see LICENSE for details.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.0.283 Oct 202630

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

PENDING
kolodkin/aaiclick

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 16:56 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:b69c9277bf4bb59ca7b5aca9f46b1bb580508416704ece6a6d3818a2a95d0add