Observed since 20 Oct, 16:56 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Data orchestration framework on ClickHouse: plain-Python pipelines, dynamic task graphs, containerized runs, lineage over MCP
aaiclick is a data orchestration framework built to make distributed computing easy, with five principles in mind:
Early stage — looking for early adopters to join the ride and provide feedback.
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.
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
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.
MIT License - see LICENSE for details.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.0.28 | 3 Oct 2026 | 30 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 16:56 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:b69c9277bf4bb59ca7b5aca9f46b1bb580508416704ece6a6d3818a2a95d0add