EverAlgo boundary: MemCell extractors (chat / workspace / agent).
Project description
everalgo-boundary
Chat boundary detection for EverAlgo — segments a flat list of ChatMessage objects into coherent MemCell slices using an LLM-based batch algorithm.
See the umbrella project: EverAlgo monorepo and the architecture document at docs/concepts/architecture.md.
Install
pip install everalgo-boundary
For the user-scenario class facade, install everalgo-user-memory instead — it re-exports BoundaryDetector which wraps this package.
What this distribution provides
| Symbol | Role |
|---|---|
detect_boundaries |
Low-level async function: (list[ChatMessage], *, llm, is_final, ...) → DetectionResult |
DetectionResult |
NamedTuple(cells: list[MemCell], tail: list[ChatMessage]) |
WorkspaceMemCellExtractor |
Placeholder stub for Jira / Email / Confluence (raises NotImplementedError) |
The class-style facades (BoundaryDetector for user-scenario chat, AgentBoundaryDetector for agent trajectories with tool calls) live in everalgo-user-memory and everalgo-agent-memory respectively.
Quick start
import asyncio
import json
from everalgo.boundary import detect_boundaries
from everalgo.llm.types import ChatMessage as LLMChatMessage, ChatResponse
from everalgo.testing.fake_llm import FakeLLMClient
from everalgo.types import ChatMessage
_BOUNDARY_JSON = json.dumps(
{"reasoning": "single topic", "boundaries": [], "should_wait": False}
)
async def main() -> None:
fake = FakeLLMClient(responses=[ChatResponse(content=_BOUNDARY_JSON, model="fake")])
messages = [
ChatMessage(id="m1", role="user", content="Let's talk about deployment.", timestamp=1_700_000_000_000, sender_id="u_alice"),
ChatMessage(id="m2", role="assistant", content="Sure — what's the target env?", timestamp=1_700_000_001_000, sender_id="assistant"),
ChatMessage(id="m3", role="user", content="K8s. Switching topic: lunch?", timestamp=1_700_000_002_000, sender_id="u_alice"),
]
# Streaming: hold `tail` between calls; pass prior tail + new messages each time.
result = await detect_boundaries(messages, llm=fake)
cells, tail = result # NamedTuple unpacking
# End-of-session: tail is forced into the last cell.
result = await detect_boundaries(messages, llm=fake, is_final=True)
assert result.tail == []
for mc in result.cells:
print(mc.timestamp, len(mc.items))
asyncio.run(main())
The streaming state machine
detect_boundaries deliberately holds back trailing messages as tail — the LLM cannot know whether a conversation continues beyond the last seen message. The caller maintains state:
tail: list[ChatMessage] = []
for batch in incoming_batches:
result = await detect_boundaries(tail + batch, llm=client)
await persist(result.cells)
tail = result.tail
# Session ends — flush everything.
final = await detect_boundaries(tail, llm=client, is_final=True)
await persist(final.cells)
Tokenizer utilities
everalgo._tokenize (in everalgo-core) exposes two module-private utilities used by boundary algorithms; not part of the public surface:
count_tokens(text: str) → int— token count under OpenAIo200k_baseencoding viatiktoken.force_split(text: str, *, max_tokens: int) → list[str]— last-resort token-bounded chunking; no semantic awareness.
Stubs
WorkspaceMemCellExtractor (Jira / Email / Confluence) is a placeholder in v0.x — all methods raise NotImplementedError. Implementation lands in a future minor bump when the RawData contract is finalised.
Related distributions
everalgo-user-memory—BoundaryDetectorclass facade for chat scenarioseveralgo-agent-memory—AgentBoundaryDetectorclass facade for agent trajectories
Project details
Release history Release notifications | RSS feed
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 everalgo_boundary-0.1.0.tar.gz.
File metadata
- Download URL: everalgo_boundary-0.1.0.tar.gz
- Upload date:
- Size: 18.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8ebd8bc29dfb247b9098533da3519748126426efa92e7747df03032a7a7f2da9
|
|
| MD5 |
60deb6f6019b3d3091b451d0de1f61da
|
|
| BLAKE2b-256 |
b067cc5580231a25b045584c0638327a1fd306932fe2a9b518750a601e974bc8
|
File details
Details for the file everalgo_boundary-0.1.0-py3-none-any.whl.
File metadata
- Download URL: everalgo_boundary-0.1.0-py3-none-any.whl
- Upload date:
- Size: 14.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6211269531a62dedad338402723c3a171e9e1c09838858947c8cba2ce1fa58cb
|
|
| MD5 |
3279a6b2938ceecd610ff0efe11ea6d6
|
|
| BLAKE2b-256 |
aec9078050d453dd6676cbb39dd63fd7f73704acbeea32b9e714be2e09ee0f52
|