From 2fd9a17c7d8d246551ddb601d73072ccea6e3f45 Mon Sep 17 00:00:00 2001 From: zhanghui Date: Mon, 7 Sep 2026 20:51:11 +0800 Subject: [PATCH] chore(release): v1.3.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Promotes 1.3.0rc1, whose only purpose was to verify the everalgo transitive pin against a real PyPI resolution — `make package` installs the built wheel with `--no-deps`, so the pipeline's own smoke cannot catch a resolution break. No `### Upgrade` group: the LanceDB table definitions are byte-identical to v1.2.3, so no rebuild is involved and a plain upgrade is all there is. The vector-metric change is described under Changed instead, since it shifts ranking but requires no action. `[Unreleased]` still compared against v1.1.4, three releases behind; moved to v1.3.0. --- CHANGELOG.md | 89 ++++++++++++++++++++++++++++++++++++++++++++++- docs/openapi.json | 2 +- pyproject.toml | 2 +- uv.lock | 2 +- 4 files changed, 91 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6516988db..6d4cb6ac6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,93 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.3.0] - 2026-09-07 + +**Milvus as an optional index backend, behind a port that hides which one you +run.** The rebuildable BM25/vector index can now live in a remote Milvus Server +or Zilliz Cloud instead of the embedded LanceDB, selected by one setting and +verified at startup. Nothing about the default installation changes: LanceDB +stays the backend, `pymilvus` stays an optional extra, and markdown stays the +source of truth — the index is derived either way, so switching backends is a +rebuild, not a migration. Both backends implement the same typed ports, so +cascade, search and `/get` never branch on physical storage; a filter is a +backend-neutral predicate tree rather than a rendered SQL string, which is what +lets one set of contract tests hold both adapters to the same behaviour. The +vector metric is now cosine everywhere, which corrects an inconsistency +described under Changed. + +### Added + +- **Optional Milvus derived-index backend.** Install with + `pip install everos[milvus]` and select it with: + + ```toml + [index] + backend = "milvus" + + [milvus] + uri = "http://127.0.0.1:19530" # or a Zilliz Cloud endpoint + token = "" # Zilliz Cloud API key + db_name = "" + consistency_level = "Session" # Strong | Bounded | Session | Eventually + collection_prefix = "everos" + ``` + + Every field binds to an environment variable + (`EVEROS_INDEX__BACKEND`, `EVEROS_MILVUS__URI`, ...). The seven business + tables are created as `_`. + + **Remote Milvus Server or Zilliz Cloud only.** A local database path is + rejected at startup rather than silently accepted: embedded Milvus Lite is + not supported, because its pure-Python rewrite degrades a single query to a + full scan and drops search-time parameters. + + Startup verifies the physical collection field by field — datatype, primary + key, nullability, vector dimension, and the index metric (dense `COSINE`, + BM25 output fields) — so a collection that disagrees with the declared schema + fails immediately instead of at the first write or search. + +### Changed + +- **Vector search now uses cosine distance on LanceDB too.** The generic + vector path called `nearest_to()` without a distance type, so it ran on + LanceDB's L2 default while `agent_skill` recall and every Milvus query + already used cosine. All of them are cosine now. **Ranking can shift for + existing deployments** — the same vectors are scored by a different metric. + No action is required and no rebuild is involved; the index is unchanged. +- **everalgo's transitive layer is pinned.** `everalgo-boundary`, + `everalgo-core` and `everalgo-clustering` are now direct `==` dependencies + matching the versions the test suite resolves. The consumer packages declare + them as `>=0.2.0,<2.0.0`, which treats a 0.x line as if only a major bump + could break compatibility, so a fresh resolution could pick releases the + suite had never run against. Raise them deliberately, together with a smoke + run against a PyPI-resolved install — `make package` installs the built + wheel with `--no-deps`, so it cannot catch a resolution break on its own. + +### Fixed + +- **`POST /api/v1/memory/add` no longer fails on a freshly resolved install.** + `everalgo-boundary` 0.3.0 added a third required field to the public + `DetectionResult` NamedTuple while `everalgo-agent-memory` 0.4.0 still built + it with two, so a default (`memorize.mode = "agent"`) install answered + `500 TypeError: DetectionResult.__new__() missing 1 required positional + argument: 'should_wait'`. Chat mode was unaffected. The pin above resolves + the compatible pair. +- **Milvus datetime round-trips are exact below the millisecond threshold.** + Timestamps were written in milliseconds but read back through a + seconds-or-milliseconds heuristic, so any instant before 2001-09-09 either + landed in the year 30000 or raised `ValueError`. Physical column reads now + use an exact inverse. +- **Concurrent `update()` on the Milvus backend no longer loses writes.** The + read half of the read-modify-write cycle sat outside the write lock, so a + backfill writing `vector` and a reflection writing `deprecated_by` could + overwrite each other on the same row. Both halves share one lock, and the + silent 10,000-row truncation on that path is gone. +- **Milvus queries stay inside the engine's result window.** Row scans and + search `topK` are bounded by the 16,384-row ceiling instead of requesting + more and failing. + + ## [1.2.3] - 2026-08-07 **Background maintenance that fails loudly instead of quietly.** A soak run on @@ -946,7 +1033,7 @@ for AI agents. - **Decoupled algorithms** — memory extraction algorithms live in the standalone `everalgo-*` libraries published on PyPI. -[Unreleased]: https://github.com/EverMind-AI/everos/compare/v1.1.4...HEAD +[Unreleased]: https://github.com/EverMind-AI/everos/compare/v1.3.0...HEAD [1.1.4]: https://github.com/EverMind-AI/everos/compare/v1.1.3...v1.1.4 [1.1.3]: https://github.com/EverMind-AI/everos/compare/v1.1.2...v1.1.3 [1.1.2]: https://github.com/EverMind-AI/everos/compare/v1.1.1...v1.1.2 diff --git a/docs/openapi.json b/docs/openapi.json index f9a2781ee..8ab0ea0da 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -3,7 +3,7 @@ "info": { "title": "everos", "description": "md-first memory extraction framework", - "version": "1.3.0rc1" + "version": "1.3.0" }, "paths": { "/health": { diff --git a/pyproject.toml b/pyproject.toml index 1462e7782..ef77eb89d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "everos" -version = "1.3.0rc1" +version = "1.3.0" description = "EverOS — local-first markdown memory framework for AI agents and user chats; lightweight, dev-friendly, small-team" license = {text = "Apache-2.0"} readme = "README.md" diff --git a/uv.lock b/uv.lock index 15ec1e158..32a961d0f 100644 --- a/uv.lock +++ b/uv.lock @@ -579,7 +579,7 @@ wheels = [ [[package]] name = "everos" -version = "1.3.0rc1" +version = "1.3.0" source = { editable = "." } dependencies = [ { name = "aiosqlite" },