Aether
A deterministic orchestration language for AI agents.
LLM agents fail silently, run code with no safety model, and produce pipelines that are impossible to audit. Aether is an intermediate representation (IR) that gives AI-generated pipelines verifiable intent, typed outputs, and compile-time safety gates — without replacing the guest languages (Python, JS, shell) your nodes already use.
"Intent is Compilation."
How it works
You write (or generate) a .ae program describing a pipeline as a directed acyclic graph of typed nodes. Each node declares what it does (_intent), what safety level it requires (_safety), what it reads (::IN), what it writes (::OUT), and what must be true after it runs (::VALIDATE). The Aether kernel executes the DAG, enforces safety gates, validates outputs, and — if a node fails — optionally calls an LLM to repair the code and retry.
§ROOT 0xFF_MAIN {
§ACT 0x1A {
::META { _intent: "fetch active users", _safety: "read_only" }
::EXEC<PYTHON> {
import urllib.request, json
return json.loads(urllib.request.urlopen("https://api.example.com/users").read())
}
::OUT { $0xUSERS: Type<JSON> }
}
§ACT 0x2B {
::META { _intent: "filter to adults only", _safety: "pure" }
::IN { $0xSRC: Ref($0xUSERS) }
::EXEC<PYTHON> {
return [u for u in $0xSRC if u["age"] >= 18]
}
::OUT { $0xADULTS: Type<JSON> }
::VALIDATE { ASSERT len($0xADULTS) >= 0 OR HALT }
}
}
Referencing ledger state in ::EXEC
Any $0xADDR token in guest code resolves from the state ledger at execution
time. You can either:
- Declare explicitly with
::IN(recommended) — gets you typed inputs, ghost aliases ($0xSRC [users]), and a documented dependency edge in the audit log. - Reference directly without
::IN— the kernel scans the code for any$0x*addresses not already bound and pulls them from the ledger. Handy for one-liners that read a single::CTXvalue. You lose the typed-binding guarantees but the pipeline still runs.
Both forms produce the same ledger reads; ::IN just makes the contract
explicit.
Or use Aether-Short (.as) for ~60% fewer lines:
@pipeline 0xFF_MAIN
$0xUSERS: JSON = @std.io.net_get() {
import urllib.request, json
return json.loads(urllib.request.urlopen("https://api.example.com/users").read())
}
$0xADULTS: JSON = @std.proc.list.filter($0xUSERS) {
return [u for u in $0xUSERS if u["age"] >= 18]
} | ASSERT len($0xADULTS) >= 0 OR HALT
@end
Why not just write Python?
| Raw Python / LangGraph | Aether | |
|---|---|---|
| Safety model | None | L0–L4 compile-time gates |
| Typed outputs | Runtime duck typing | Declared + validated at write time |
| Audit trail | Manual logging | Automatic output.ae.json with full node traces |
| Self-healing | Manual try/except | ASSERT ... OR RETRY(3) — LLM repairs the node |
| LLM generation cost | 715–1,225 tokens (LangGraph/AutoGen) | 415 tokens (3-node baseline) |
| Runtime LLM calls | 0 (LangGraph) — 6,200 (AutoGen) | 0 for deterministic pipelines |
See docs/benchmark.md for the full token-cost comparison.
Features
Safety — the declaration is checked, not trusted
- 5-tier safety model — L0 (pure math) → L4 (system root). Nodes above your threshold are blocked before execution.
- Effect inference — the kernel reads each node's guest code and derives the level it actually needs. A mismatch is reported on every run;
--verify-effectsblocks it. A node taggedpurethat importsrequestsdoes not get to run. - Secret taint propagation — values resolved from
ENV:are redacted, and so is anything computed from them, in the ledger, the trace and the cache alike.std.sec.hash.sha2andstd.sec.mask.piiare the sanctioned ways to release a derivative.
Verifiability — a run you can check afterwards
- Execution root hash — every node is content-addressed over its code, resolved inputs and declared contract; the per-node commitments fold into one
root_fingerprint. Two runs sharing that hash provably ran the same code on the same inputs and got the same answers. - Plan validation —
aether check <file>(or--dry-run) proves every::INreference resolves, no address has two writers, and the graph is acyclic. Exits non-zero, so it drops straight into a save hook or CI. - Typed state ledger — outputs are written to an address space (
$0xADDR) with type validation on every write.
Execution
- Parallel DAG execution — independent nodes run concurrently, bounded by
--max-parallel; dependencies resolved with Kahn's topological sort. §MAPfan-out —§MAP 0x2B OVER $0xITEMS AS $0xITEM { … }runs one body per element of a runtime list. A map is one node in the graph, so plan checking and the root hash keep working even though N is unknown until the run.§FAILhandlers — a block that runs after the graph, and only if something failed, with the failure summary bound to$0xFAILURES. Write a partial report, notify, clean up.::ON { 0x2B }scopes a handler to specific nodes, and scopes what it sees, so reacting differently to different failures does not mean branching inside the guest.- Memoization —
--cachereuses results for nodes whose code and inputs are unchanged. Eligible only when pure/read-only, statically transparent, and untainted; a cached run still agrees with an uncached one on the root hash. - Per-node timeouts —
--timeoutbounds any single node, and the guest process is killed rather than abandoned.
Authoring
- ASL registry — 38 canonical intents (
std.io.*,std.proc.*,std.ml.*,std.sec.*, …) with safety and language defaults. Unknownstd.*intents are hard errors; custom namespaces (myorg.etl.*) are accepted. - Self-healing RETRY —
ASSERT expr OR RETRY(3)sends the failing code to a registered LLM handler for repair. It remembers every rejected attempt, refuses assertions no rewrite could satisfy, and rejects candidates that do not parse before spending a call. - English Toggle —
aether gen "description"turns plain English into a.aeprogram. - MCP server —
aether-mcpexposes validate/execute/audit/inspect as tools for Claude Code and other MCP-compatible clients.aether_validateruns the full plan check, not just a parse, so an agent checking its own generated pipeline gets the same answeraether checkwould give. - REST API —
aether-apiruns on port 3737 for LangChain, AutoGen, n8n, or any HTTP client.GET /grammarreturns a machine-readable summary of the language for LLM consumption. - Aether Lens — a standalone DAG visualizer (
lens/index.html) that renders anyoutput.ae.jsonexecution log.
On isolation. Guest code runs as an ordinary host subprocess. Everything above is analysis — it catches accidents and dishonest safety tags, which is the common case, but it does not contain a determined program. Real containment needs the WASM runtime tracked in
ROADMAP.md. Run untrusted pipelines under an OS-level sandbox of your own until then.
Aether Lens
Every execution writes an output.ae.json audit log. Open lens/index.html in any browser to visualize it — no build step, no npm, no server required.
Each node card shows its intent, safety level, execution time, and status — color-coded at a glance:
| Color | Meaning |
|---|---|
| Green | Completed successfully |
Amber (HEALED) |
Failed, repaired by LLM, re-ran successfully |
Red (BLOCKED) |
Skipped — upstream dependency failed or safety gate rejected |
| Orange | Failed with no recovery |
Click any node to open the detail panel: full JSON output, validation results, and the heal log if self-healing was attempted. The ledger bar at the bottom shows every live state address and its current value.
# Serve locally to auto-load output.ae.json
cd lens && python -m http.server 8080
# → open http://localhost:8080
# Or just open the file directly and drag-and-drop any output.ae.json
open lens/index.html
Installation
# Option 1: pip (recommended — no Rust required)
pip install aether-kernel
# Option 2: Pre-built binary
curl -fsSL https://raw.githubusercontent.com/baiers/aether/main/install.sh | bash
# Option 3: Build from source
cargo build --release
Quick Start
# Run a pipeline
aether examples/demo.ae
# Expand Aether-Short to inspect generated .ae
aether examples/pipeline.as --expand-only
# Run with a higher safety threshold (allow network calls)
aether examples/demo_showcase.ae --safety l3
# Self-healing (requires ANTHROPIC_API_KEY)
ANTHROPIC_API_KEY=sk-... aether examples/self_heal_demo.ae
# Generate a .ae program from plain English
ANTHROPIC_API_KEY=sk-... aether gen "fetch the top 10 HN stories and summarize each one"
# Start the REST API
aether-api # → http://localhost:3737
# Start the MCP server (for Claude Code integration)
aether-mcp
Claude Code / MCP Integration
Add to your MCP config (~/.claude/mcp_config.json):
{
"mcpServers": {
"aether-kernel": {
"command": "aether-mcp",
"args": []
}
}
}
Claude can then call these directly:
| Tool | Does |
|---|---|
aether_validate |
Parse and plan-check without running: every ::IN Ref() resolves, no address has two writers, the graph is acyclic, every §FAIL ::ON target exists |
aether_execute |
Run a program. Takes safety_level, verify_effects, strict_registry, use_registry, timeout_seconds, max_parallel |
aether_audit |
Send an execution log to the registered LLM handler for a natural-language report |
aether_inspect |
Retrieve a previous execution log by its id |
Set verify_effects: true when running code you did not write — it infers each
node's real effect level from its guest body and blocks any node needing more
than its _safety tag declares.
Project Structure
src/ Rust kernel (parser, executor, ASL registry, self-healing, MCP, REST API)
asl/ ASL registry — 38 canonical intents (JSON)
examples/ Runnable .ae and .as programs
spec/ Formal EBNF grammar and type system docs
docs/ Whitepaper, benchmark paper, kernel manual
lens/ Aether Lens DAG visualizer (standalone HTML, no build step)
sdk/ LLM system prompt, MCP config, audit prompt
benchmark/ LangGraph / AutoGen equivalents + token counting scripts
python/ pip-installable wrapper (aether-kernel)
What's Included (Community — Free, Apache 2.0)
| Feature | |
|---|---|
| Parser, AST, topological executor | ✓ |
| 5-tier safety model (L0–L4) | ✓ |
| ASL registry (38 canonical intents) | ✓ |
| Aether-Short (.as) notation | ✓ |
Self-healing RETRY (your ANTHROPIC_API_KEY) |
✓ |
English Toggle aether gen (your ANTHROPIC_API_KEY) |
✓ |
| MCP server for Claude Code | ✓ |
| REST API | ✓ |
| Aether Lens DAG visualizer | ✓ |
Aether Pro (coming soon) — hosted execution, managed LLM calls (no API key needed), extended ASL (200+ intents), persistent history. Join the waitlist →
License
Licensed under the Apache License 2.0.
See docs/open-core.md for the Community vs Pro vs Enterprise breakdown.
Metadata
Release files for aether-kernel 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| aether_kernel-0.4.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| aether_kernel-0.4.0-py3-none-manylinux_2_17_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| aether_kernel-0.4.0-py3-none-macosx_14_0_arm64.whl | Python 3 | none | macOS 14.0+ ARM64 | Details |
| aether_kernel-0.4.0-py3-none-macosx_13_0_x86_64.whl | Python 3 | none | macOS 13.0+ x86-64 | Details |
Total release size: 24.0 MB
Release files / aether_kernel-0.4.0-py3-none-win_amd64.whl
| Download URL | aether_kernel-0.4.0-py3-none-win_amd64.whl |
|---|---|
| Size | 3.1 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
4483fcce993d8b34023834bbe860fdadf50f446718f0377ae2727f055357e47c
|
|
BLAKE2b-256 checksum How to use checksums |
593e81d3ea983b8e61d0172e5b851a1b5c73ecee2a6f24df2539fc1c11fa3afb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / aether_kernel-0.4.0-py3-none-manylinux_2_17_x86_64.whl
| Download URL | aether_kernel-0.4.0-py3-none-manylinux_2_17_x86_64.whl |
|---|---|
| Size | 7.0 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
69d34f1577f873ffda0d9c5cc0c7de8d84442eeb7cbdb92984a34060277dcdc6
|
|
BLAKE2b-256 checksum How to use checksums |
ca04748b673162c95729f6265cfb88c6df8f7de94c5fd83e559120e05450a806
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / aether_kernel-0.4.0-py3-none-macosx_14_0_arm64.whl
| Download URL | aether_kernel-0.4.0-py3-none-macosx_14_0_arm64.whl |
|---|---|
| Size | 7.0 MB |
| Tags | Python 3 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
6bebe87da9100d0be54c2fe43e82f80f0e451eceb1de87c03fe25312bf1e6d6e
|
|
BLAKE2b-256 checksum How to use checksums |
637dd1f0d2b18c86406e6018424ea11b55c05191256e516ce07ab83dd11e439f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / aether_kernel-0.4.0-py3-none-macosx_13_0_x86_64.whl
| Download URL | aether_kernel-0.4.0-py3-none-macosx_13_0_x86_64.whl |
|---|---|
| Size | 7.0 MB |
| Tags | Python 3 macOS 13.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
b9e2256ea59ac9784d0fe2e25ab237f47a5e66eaa6b7a78940d06aea8f8513ee
|
|
BLAKE2b-256 checksum How to use checksums |
549d60107ff79808499acf8ab6e4d7101d6f98f3ed7ce6f436db3b7969617ca7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Security for aether-kernel 0.4.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.