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
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aether_ai-0.5.0.tar.gz.
File metadata
- Download URL: aether_ai-0.5.0.tar.gz
- Upload date:
- Size: 125.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
57a43a9385e53d9ba634fc21c7f73cb8e8eeafa0048729f83ec9682b82b907f9
|
|
| MD5 |
4a7fe25ba92df9ba42908d11f0295923
|
|
| BLAKE2b-256 |
e6a9fd9d79dead9d65aa28814c008feeeb3881a4fb359d853f1000d9dc7149e2
|
Provenance
The following attestation bundles were made for aether_ai-0.5.0.tar.gz:
Publisher:
release.yml on Quintessence-Group/aether-sdk-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aether_ai-0.5.0.tar.gz -
Subject digest:
57a43a9385e53d9ba634fc21c7f73cb8e8eeafa0048729f83ec9682b82b907f9 - Sigstore transparency entry: 2194773185
- Sigstore integration time:
-
Permalink:
Quintessence-Group/aether-sdk-python@dfe62d46e0abd897e6964bec7b93df0f63329996 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/Quintessence-Group
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@dfe62d46e0abd897e6964bec7b93df0f63329996 -
Trigger Event:
push
-
Statement type:
File details
Details for the file aether_ai-0.5.0-py3-none-any.whl.
File metadata
- Download URL: aether_ai-0.5.0-py3-none-any.whl
- Upload date:
- Size: 83.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f383211027df9602a9adb09522253606759f963a666880aff79305c9343833a8
|
|
| MD5 |
9a05c1996bb1befd8e8eb9cfef63a2d9
|
|
| BLAKE2b-256 |
6033cc68d3a1fabc6f22cd3e6185fa34ce21fe4d5b1e8b606bb73d8a012d43ce
|
Provenance
The following attestation bundles were made for aether_ai-0.5.0-py3-none-any.whl:
Publisher:
release.yml on Quintessence-Group/aether-sdk-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aether_ai-0.5.0-py3-none-any.whl -
Subject digest:
f383211027df9602a9adb09522253606759f963a666880aff79305c9343833a8 - Sigstore transparency entry: 2194773186
- Sigstore integration time:
-
Permalink:
Quintessence-Group/aether-sdk-python@dfe62d46e0abd897e6964bec7b93df0f63329996 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/Quintessence-Group
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@dfe62d46e0abd897e6964bec7b93df0f63329996 -
Trigger Event:
push
-
Statement type: