EverAlgo is the algorithm library behind EverMind's memory system — stateless, storage-free, focused on extraction and ranking only. Orchestration, persistence, and routing live upstream in evermem.
- Algorithm engineers iterate fast. EverAlgo is the algorithm team's home base — every change to extraction strategies, prompts, fusion math, and ranker weights happens here without going through service-layer ceremony.
- Pure functions, easy to reason about. No DB, no filesystem, no business state. All operators are plain in-memory transforms with explicit input / output types.
- One codebase serves both the open-source and the commercial cloud builds. The same
everalgo.*packages are consumed by both editions.
The full architecture lives in docs/concepts/architecture.md.
This repo is a monorepo of 8 distributions sharing the everalgo.* namespace via PEP 420, managed with uv workspace (seven published to PyPI; everalgo-knowledge is namespace-reserved and not yet published — see Status & known limitations):
| Distribution | What it provides |
|---|---|
everalgo-core |
Types, LLM client + providers, prompt helpers, testing utilities |
everalgo-boundary |
detect_boundaries + DetectionResult + token helpers |
everalgo-clustering |
Cluster value object + cluster_by_geometry / cluster_by_llm operators |
everalgo-rank |
4 rankers (episodic / profile / case / skill) over fusion / weight / rerank toolkit |
everalgo-parser |
Multimodal raw-file → ParsedContent (EXPERIMENTAL — stub) |
everalgo-user-memory |
BoundaryDetector + Episode / Foresight / AtomicFact / Profile extractors |
everalgo-agent-memory |
AgentBoundaryDetector + AgentCase / AgentSkill extractors |
everalgo-knowledge |
KnowledgeMemory extractor (NOT YET IMPLEMENTED — not published) |
Install all packages into a shared editable venv, then run the offline examples — no API key required:
git clone git@github.com:EverMind-AI/EverAlgo.git
cd everalgo
uv sync --all-packages # editable-install all 8 packages into a shared venv
uv run pre-commit install # register the git hook (ruff + standard sanitisers)
ls .git/hooks/pre-commit # MUST exist — see AGENTS.md §3 "Common pitfall"
uv run python examples/01_boundary_chat.py # Chat → MemCell
uv run python examples/03_user_memory_episode.py # MemCell → Episode
uv run python examples/04_agent_memory_case.py # Agent trajectory → AgentCase
uv run python examples/06_full_user_memory_pipeline.py # Full pipeline
uv run pytest # workspace-wide test suiteNote
If .git/hooks/pre-commit does not exist after the install step, hooks won't fire at git commit time. Verify the file every clone. Details in AGENTS.md §3.
import asyncio
import json
import numpy as np
from everalgo.clustering import Cluster, cluster_by_geometry
from everalgo.llm.types import ChatResponse
from everalgo.testing.fake_llm import FakeLLMClient
from everalgo.types import ChatMessage
from everalgo.user_memory import (
BoundaryDetector, EpisodeExtractor, ForesightExtractor,
AtomicFactExtractor, ProfileExtractor,
)
_BOUNDARY_JSON = json.dumps({"reasoning": "single topic", "boundaries": [], "should_wait": False})
_EPISODE_JSON = json.dumps({"title": "Alice asks about async", "content": "Alice explored async patterns."})
_FORE_JSON = json.dumps([{"content": "Alice will read the follow-up doc", "evidence": "assistant promised a doc", "start_time": "2023-11-14", "end_time": "2023-11-21", "duration_days": 7}])
_FACT_JSON = json.dumps({"atomic_facts": {"time": "Nov 14 2023", "atomic_fact": ["Alice is learning Python async."]}})
_PROFILE_JSON = json.dumps({"explicit_info": [], "implicit_traits": [{"category": "Technical", "description": "Python developer."}]})
async def main() -> None:
fake = FakeLLMClient(responses=[
ChatResponse(content=_BOUNDARY_JSON, model="fake"),
ChatResponse(content=_EPISODE_JSON, model="fake"),
ChatResponse(content=_FORE_JSON, model="fake"),
ChatResponse(content=_FACT_JSON, model="fake"),
ChatResponse(content=_PROFILE_JSON, model="fake"),
])
messages = [
ChatMessage(id="m1", role="user", content="I want to learn Python async retry patterns.", timestamp=1_700_000_000_000, sender_id="u_alice", sender_name="Alice"),
ChatMessage(id="m2", role="assistant", content="Sure — I'll send a follow-up doc next week.", timestamp=1_700_000_001_000, sender_id="assistant"),
]
# Step 1 — boundary detection
result = await BoundaryDetector(llm=fake).adetect(messages, is_final=True)
mc = result.cells[0]
# Steps 2–4 — extract user-memory products (sender_id is required, not inferred)
episode = await EpisodeExtractor(llm=fake).aextract(mc, sender_id="u_alice")
foresights = await ForesightExtractor(llm=fake).aextract(mc, sender_id="u_alice")
facts = await AtomicFactExtractor(llm=fake).aextract(mc, sender_id="u_alice")
# Step 5 — cluster the cell (caller wraps as size-1 Cluster, no LLM), then extract profile
vector = np.random.rand(2560).astype(np.float32)
existing: list[Cluster] = []
new_cluster = Cluster(centroid=vector, last_ts=mc.timestamp)
merged = cluster_by_geometry(new_cluster, existing)
if merged is None:
existing.append(new_cluster.model_copy(update={"id": "cid_001"}))
profile = await ProfileExtractor(llm=fake).aextract([mc], sender_id="u_alice")
print(f"episode: {episode.subject!r}")
print(f"foresights: {len(foresights)}, facts: {len(facts)}")
print(f"profile summary: {profile.summary!r}")
asyncio.run(main())Install only the distributions you need; transitive deps are pulled automatically:
pip install everalgo-user-memory # pulls core + boundary
pip install everalgo-agent-memory # pulls core + boundary + clustering
pip install everalgo-rank # pulls core
pip install everalgo-clustering # pulls coreSeven of the eight distributions are published on PyPI at 0.1.x; everalgo-knowledge is intentionally not published (namespace reserved only). Three operators are unimplemented placeholders that raise NotImplementedError — they are deliberately kept out of the public __all__ (import the submodule directly if you want the reserved stub) and must not be relied on yet:
| Placeholder | Reachable at | Status |
|---|---|---|
WorkspaceMemCellExtractor |
everalgo.boundary.workspace |
Jira / Email / Confluence slicing — not implemented |
KnowledgeExtractor |
everalgo.knowledge |
whole everalgo-knowledge distribution unpublished |
| video parsing | everalgo.parser.video |
deferred pending an ADR (Gemini Video vs Whisper + frame sampling) |
Everything else is fully implemented and tested: boundary detection, both clustering operators, all four rankers, the user-memory extractors (Episode / Foresight / AtomicFact / Profile), and the agent-memory extractors (Case / Skill).
Every distribution is released independently: each packages/everalgo-*/pyproject.toml carries its own version = "..." and follows its own SemVer cadence. There is no umbrella version — bumping everalgo-rank does not require bumping anything else.
The repo uses a two-tier CHANGELOG:
CHANGELOG.mdat the root — current-version overview table.packages/everalgo-<dist>/CHANGELOG.mdper distribution — full history; ships inside the wheel.
Per-distribution changelogs are generated by git-cliff from Conventional Commit messages on main (see cliff.toml for the parser config; see AGENTS.md §6 for the commit-message contract).
The full, verified step-by-step procedure is in
docs/releasing.md— including the canary-first / one-tag-at-a-time lessons learned in the 0.2.0 release. The steps below are a quick reference.
Steps for releasing everalgo-clustering v0.2.0:
-
Bump the version. Open an MR editing
packages/everalgo-clustering/pyproject.toml; merge tomainvia squash. -
Generate the changelog fragment.
git checkout main && git pull uv run git-cliff \ --tag everalgo-clustering/v0.2.0 \ --include-path 'packages/everalgo-clustering/**' \ --unreleased \ --prepend packages/everalgo-clustering/CHANGELOG.md
-
Review and polish. git-cliff gives a draft, not a final — edit for clarity and add Breaking-Changes call-outs.
-
Update the root CHANGELOG table row for this distribution.
-
Commit + tag + push.
git add packages/everalgo-clustering/CHANGELOG.md CHANGELOG.md git commit -m "📝 docs(clustering): release notes for v0.2.0" git push origin main git tag everalgo-clustering/v0.2.0 git push origin everalgo-clustering/v0.2.0 -
Publish to PyPI. Current state (0.1.x): manual — run
uv build --package everalgo-<name>thenuv publishper distribution; see the PyPA publishing guide for the underlying steps. Planned (post-0.1.x): a.gitlab-ci.ymlpublish stage will trigger on<dist>/v<semver>tag push using PyPI Trusted Publishers (OIDC, no long-lived tokens).
Tag format: <dist-name>/v<semver> — e.g. everalgo-core/v0.1.0, everalgo-rank/v0.2.0.
-
uv run pytestis green onmain. -
uv run ruff check . && uv run ruff format --check .pass. -
uv run mypy . && uv run pyrightpass. - The bumped
versionhonours SemVer relative to the previous tag. - The
packages/everalgo-<dist>/CHANGELOG.mdsection has been reviewed and edited. - The root
CHANGELOG.mdtable row has been updated.
Read AGENTS.md — the single source of truth for assistant context. CLAUDE.md and .cursorrules are symlinks to it.
docs/index.md— project landing pagedocs/installation.md— install + prerequisitesdocs/getting-started.md— 5-minute quickstartdocs/concepts/— architecture, stateless-design, async/sync bridgedocs/api/— per-package API referencedocs/version-policy.md— SemVer + supported Python versionsdocs/contributing.md— how to contributeexamples/— runnable quickstart scripts (01 through 07)AGENTS.md— onboarding for AI assistants + contributors