aaiclick
aaiclick is a data orchestration framework built to make distributed computing easy, with five principles in mind:
- Simplicity — Plain Python, no SQL. Decorate functions into tasks and jobs, run with zero setup on your laptop, scale out unchanged.
- Dynamic Graphs — Tasks spawn tasks. The pipeline shapes itself to the data while it runs instead of being declared up front.
- Performance — Data lives and computes in ClickHouse. Python only orchestrates; nothing is shuffled through Python memory.
- Containerized Runs — Pin a container image, by tag or git SHA, per job or per task. Host and container tasks mix in one pipeline.
- 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
License
MIT License - see LICENSE for details.
Metadata
Release files for aaiclick 0.0.28
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| aaiclick-0.0.28.tar.gz | 1.8 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aaiclick-0.0.28-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.8 MB
Release files / aaiclick-0.0.28.tar.gz
| Download URL | aaiclick-0.0.28.tar.gz |
|---|---|
| Size | 1.8 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b0ce7f4b1461860e424d1b23e141c51e1d4df44cb61113b66e74b682568b978f
|
|
BLAKE2b-256 checksum How to use checksums |
28e5d42fb063d7d8e4803eb69db3d48ca124ecd773a1683a66f906d131a958a1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency logRelease files / aaiclick-0.0.28-py3-none-any.whl
| Download URL | aaiclick-0.0.28-py3-none-any.whl |
|---|---|
| Size | 1.0 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f2c4afe0aa4077a423f1eebabcbe32ff0a62cca5536e6321a8451604e9e7853d
|
|
BLAKE2b-256 checksum How to use checksums |
f4c30e897876085720dc46c1119ce03b2a3d1b2c91ba3c3dc75ec867aec1101a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency log