aether-ai
Python SDK for the Aether decentralized RAG API.
Installation
pip install aether-ai
Memory — the fastest way to build agent memory
For per-user or per-agent memory, reach for the Memory facade. Construct it once
with an entity id and every call is automatically scoped to that entity — no tags or
filters to manage:
from aether import Memory
mem = Memory("patient-john", api_key="aether_your_key_here")
# Store a memory
mem.remember("Anxious about flying; uses 4-7-8 breathing")
# Recall the most relevant memories for this entity
for item in mem.recall("anxiety coping"):
print(item.score, item.text)
# Newest-first history, or wipe the slate
mem.list(limit=20)
mem.forget_all()
recall(query, k=5, recency_weight=0.0, since=..., until=..., filter=...)blends relevance (ascorein(0, 1], higher is better) with optional exponential recency decay, and can filter on the metadata you stored.remember(text, metadata={...})stores the memory and writesmetadataas searchablekey:valuetags.AsyncMemorymirrors the same surface withawaiton every call.
The raw AetherClient below is the lower-level API — use it when you need direct
control over documents, search, and batch operations rather than entity-scoped memory.
Quick Start
from aether import AetherClient
client = AetherClient(api_key="aether_your_key_here")
# Insert a file — content type is auto-detected from the extension
doc = client.insert("report.pdf")
print(f"Inserted: {doc.doc_id}")
# Insert raw text
doc = client.insert_text("Some text content to index")
# Search
results = client.search("machine learning", k=5)
for r in results:
print(f" {r.doc_id} (score: {r.score}) - {r.passage}")
# List documents
for doc in client.list():
print(f" {doc.doc_id}: {doc.title}")
Per-user permissions & audit
Restrict who can read a document, then scope a client to act on behalf of a principal so reads are filtered by each document's ACL:
from aether import AetherClient, PrincipalPinMismatchError
client = AetherClient(api_key="aether_your_key_here")
# Write with a read-ACL — only alice and the eng group can read this document.
# Omit acl_readers (or pass []) for the admin-only default.
doc = client.insert_text(
"Q3 board deck notes",
acl_readers=["user:alice", "group:eng"],
)
# Act as a principal: searches and reads only surface documents this principal
# is allowed to see. Composes with client.partition(...).
alice = client.as_principal("user:alice", groups=["group:eng"])
for r in alice.search("board deck", k=5):
print(r.doc_id, r.score)
# Query the tenant's access-audit log (requires audit capture to be enabled).
page = client.audit.access(action="read", limit=100)
print(f"{page.total} read events")
for rec in page:
print(rec.at, rec.actor, rec.action, rec.resource)
A principal-pinned API key that is asked to assert a different principal raises
PrincipalPinMismatchError. AsyncAetherClient mirrors the same surface with
await.
Supported File Formats
Aether automatically extracts clean text from binary documents before embedding. No need to specify content_type -- it's guessed from the file extension.
| Format | Extensions |
|---|---|
| Word | .docx, .doc |
| PowerPoint | .pptx, .ppt |
| Excel | .xlsx, .xls |
| HTML | .html, .htm |
| CSV | .csv |
| Plain text | .txt, .md, .json, .xml |
Binary-format parsing is handled automatically server-side — no setup required.
RAG Quick Start
Use retrieve() to search and get document content in a single call -- ready to pass into any LLM:
from aether import AetherClient
client = AetherClient(api_key="your_key")
# Insert documents (PDF, DOCX, XLSX — all auto-detected)
client.insert("company-handbook.pdf")
client.insert("benefits-guide.docx")
client.insert_text("Remote work is allowed 3 days per week...")
# Retrieve relevant documents with content
results = client.retrieve("How much PTO do I get?", k=3)
for r in results:
print(f"{r.title}: {r.content[:100]}...")
For complete RAG examples with Anthropic, OpenAI, Azure, and more, see examples/.
Async Processing
For large files or frontend integrations that need progress feedback, use the async REST endpoint:
import httpx, time
resp = httpx.post(
"https://api.aetherdb.ai/documents/async?filename=report.pdf",
content=open("report.pdf", "rb").read(),
headers={"Authorization": "Bearer aether_..."},
)
job = resp.json() # {"job_id": "...", "poll_url": "/documents/jobs/..."}
while True:
status = httpx.get(
f"https://api.aetherdb.ai{job['poll_url']}",
headers={"Authorization": "Bearer aether_..."},
).json()
print(f"{status['progress']:.0%} - {status['message']}")
if status["status"] in ("completed", "failed"):
break
time.sleep(0.5)
CLI
aether-py status
aether-py insert document.pdf
aether-py search "your query"
aether-py list
License
MIT
Metadata
Release files for aether-ai 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| aether_ai-0.6.0.tar.gz | 138.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aether_ai-0.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 230.1 kB
Release files / aether_ai-0.6.0.tar.gz
| Download URL | aether_ai-0.6.0.tar.gz |
|---|---|
| Size | 138.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
24bf2cf51f6f5cd414a6de504bd8774778ba92f822224eadefcfbe3cf0b93158
|
|
BLAKE2b-256 checksum How to use checksums |
96ab16d18a3ac62393523173825cf6b9dd22bf66b9f5eadb09f21ffef4baecf6
|
| 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 Sep 7, 2026.
Transparency logRelease files / aether_ai-0.6.0-py3-none-any.whl
| Download URL | aether_ai-0.6.0-py3-none-any.whl |
|---|---|
| Size | 91.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e9f11a28a6c60bc6618f98fa0e674cb1f41df77bbe8c0b66c6d9ed26c0b65631
|
|
BLAKE2b-256 checksum How to use checksums |
1ea2db670728ac3f798910e492ed4c521f09053a24448d189f6d4cc3e6d06bbe
|
| 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 Sep 7, 2026.
Transparency log