Skip to content

Commit ebda5c7

Browse files
committed
🔀 chore: Merge latest main into PR branch
2 parents d4b7556 + e8612b9 commit ebda5c7

115 files changed

Lines changed: 6825 additions & 1429 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,75 @@ jobs:
126126
- name: Integration tests
127127
run: make integration
128128

129+
integration-milvus:
130+
name: integration tests (Milvus 2.6)
131+
runs-on: ubuntu-latest
132+
steps:
133+
- uses: actions/checkout@v6
134+
135+
- name: Install uv
136+
uses: astral-sh/setup-uv@v8.2.0
137+
with:
138+
enable-cache: true
139+
cache-dependency-glob: uv.lock
140+
141+
- name: Set up Python
142+
run: uv python install 3.12
143+
144+
- name: Install dependencies (frozen)
145+
run: make install-deps
146+
147+
- name: Start Milvus 2.6.22
148+
run: |
149+
curl --fail --location --retry 3 \
150+
--output /tmp/milvus-compose.yml \
151+
https://github.com/milvus-io/milvus/releases/download/v2.6.22/milvus-standalone-docker-compose.yml
152+
docker compose -f /tmp/milvus-compose.yml up -d
153+
for attempt in {1..60}; do
154+
if curl --fail --silent http://127.0.0.1:9091/healthz >/dev/null; then
155+
exit 0
156+
fi
157+
sleep 2
158+
done
159+
docker compose -f /tmp/milvus-compose.yml logs
160+
exit 1
161+
162+
- name: Milvus repository contract
163+
env:
164+
EVEROS_TEST_MILVUS_URI: http://127.0.0.1:19530
165+
EVEROS_TEST_MILVUS_FULL_STARTUP: "1"
166+
run: uv run --frozen pytest tests/integration/test_milvus_remote.py -v
167+
168+
- name: Milvus /get truncation telemetry
169+
env:
170+
EVEROS_TEST_MILVUS_URI: http://127.0.0.1:19530
171+
run: >-
172+
uv run --frozen pytest
173+
tests/e2e/test_get_endpoint_e2e.py::test_get_truncates_above_max_fetch
174+
-v -k milvus
175+
176+
# The contract tests above exercise the repository port directly. This
177+
# drives the same request path the application does -- /add, /flush,
178+
# cascade, every search method, /get -- against the remote backend, so a
179+
# break anywhere between the API and Milvus surfaces here rather than in
180+
# production. Deselecting the LanceDB half keeps the job to its subject.
181+
- name: Milvus end-to-end (tiered API suites)
182+
env:
183+
EVEROS_TEST_MILVUS_URI: http://127.0.0.1:19530
184+
run: uv run --frozen pytest tests/integration/test_tiers -v -k milvus
185+
186+
# The structural half of the port contract runs in the ordinary unit job
187+
# for both adapters. The behavioural half needs a server, so it only has
188+
# a backend to compare against here.
189+
- name: Derived-index port contract (both backends)
190+
env:
191+
EVEROS_TEST_MILVUS_URI: http://127.0.0.1:19530
192+
run: uv run --frozen pytest tests/unit/test_infra/test_index_contract.py -v
193+
194+
- name: Stop Milvus
195+
if: always()
196+
run: docker compose -f /tmp/milvus-compose.yml down -v
197+
129198
package:
130199
name: package build
131200
runs-on: ubuntu-latest

CHANGELOG.md

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,93 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [1.3.0] - 2026-09-07
11+
12+
**Milvus as an optional index backend, behind a port that hides which one you
13+
run.** The rebuildable BM25/vector index can now live in a remote Milvus Server
14+
or Zilliz Cloud instead of the embedded LanceDB, selected by one setting and
15+
verified at startup. Nothing about the default installation changes: LanceDB
16+
stays the backend, `pymilvus` stays an optional extra, and markdown stays the
17+
source of truth — the index is derived either way, so switching backends is a
18+
rebuild, not a migration. Both backends implement the same typed ports, so
19+
cascade, search and `/get` never branch on physical storage; a filter is a
20+
backend-neutral predicate tree rather than a rendered SQL string, which is what
21+
lets one set of contract tests hold both adapters to the same behaviour. The
22+
vector metric is now cosine everywhere, which corrects an inconsistency
23+
described under Changed.
24+
25+
### Added
26+
27+
- **Optional Milvus derived-index backend.** Install with
28+
`pip install everos[milvus]` and select it with:
29+
30+
```toml
31+
[index]
32+
backend = "milvus"
33+
34+
[milvus]
35+
uri = "http://127.0.0.1:19530" # or a Zilliz Cloud endpoint
36+
token = "" # Zilliz Cloud API key
37+
db_name = ""
38+
consistency_level = "Session" # Strong | Bounded | Session | Eventually
39+
collection_prefix = "everos"
40+
```
41+
42+
Every field binds to an environment variable
43+
(`EVEROS_INDEX__BACKEND`, `EVEROS_MILVUS__URI`, ...). The seven business
44+
tables are created as `<collection_prefix>_<kind>`.
45+
46+
**Remote Milvus Server or Zilliz Cloud only.** A local database path is
47+
rejected at startup rather than silently accepted: embedded Milvus Lite is
48+
not supported, because its pure-Python rewrite degrades a single query to a
49+
full scan and drops search-time parameters.
50+
51+
Startup verifies the physical collection field by field — datatype, primary
52+
key, nullability, vector dimension, and the index metric (dense `COSINE`,
53+
BM25 output fields) — so a collection that disagrees with the declared schema
54+
fails immediately instead of at the first write or search.
55+
56+
### Changed
57+
58+
- **Vector search now uses cosine distance on LanceDB too.** The generic
59+
vector path called `nearest_to()` without a distance type, so it ran on
60+
LanceDB's L2 default while `agent_skill` recall and every Milvus query
61+
already used cosine. All of them are cosine now. **Ranking can shift for
62+
existing deployments** — the same vectors are scored by a different metric.
63+
No action is required and no rebuild is involved; the index is unchanged.
64+
- **everalgo's transitive layer is pinned.** `everalgo-boundary`,
65+
`everalgo-core` and `everalgo-clustering` are now direct `==` dependencies
66+
matching the versions the test suite resolves. The consumer packages declare
67+
them as `>=0.2.0,<2.0.0`, which treats a 0.x line as if only a major bump
68+
could break compatibility, so a fresh resolution could pick releases the
69+
suite had never run against. Raise them deliberately, together with a smoke
70+
run against a PyPI-resolved install — `make package` installs the built
71+
wheel with `--no-deps`, so it cannot catch a resolution break on its own.
72+
73+
### Fixed
74+
75+
- **`POST /api/v1/memory/add` no longer fails on a freshly resolved install.**
76+
`everalgo-boundary` 0.3.0 added a third required field to the public
77+
`DetectionResult` NamedTuple while `everalgo-agent-memory` 0.4.0 still built
78+
it with two, so a default (`memorize.mode = "agent"`) install answered
79+
`500 TypeError: DetectionResult.__new__() missing 1 required positional
80+
argument: 'should_wait'`. Chat mode was unaffected. The pin above resolves
81+
the compatible pair.
82+
- **Milvus datetime round-trips are exact below the millisecond threshold.**
83+
Timestamps were written in milliseconds but read back through a
84+
seconds-or-milliseconds heuristic, so any instant before 2001-09-09 either
85+
landed in the year 30000 or raised `ValueError`. Physical column reads now
86+
use an exact inverse.
87+
- **Concurrent `update()` on the Milvus backend no longer loses writes.** The
88+
read half of the read-modify-write cycle sat outside the write lock, so a
89+
backfill writing `vector` and a reflection writing `deprecated_by` could
90+
overwrite each other on the same row. Both halves share one lock, and the
91+
silent 10,000-row truncation on that path is gone.
92+
- **Milvus queries stay inside the engine's result window.** Row scans and
93+
search `topK` are bounded by the 16,384-row ceiling instead of requesting
94+
more and failing.
95+
96+
1097
## [1.2.3] - 2026-08-07
1198

1299
**Background maintenance that fails loudly instead of quietly.** A soak run on
@@ -946,7 +1033,7 @@ for AI agents.
9461033
- **Decoupled algorithms** — memory extraction algorithms live in the standalone
9471034
`everalgo-*` libraries published on PyPI.
9481035

949-
[Unreleased]: https://github.com/EverMind-AI/everos/compare/v1.1.4...HEAD
1036+
[Unreleased]: https://github.com/EverMind-AI/everos/compare/v1.3.0...HEAD
9501037
[1.1.4]: https://github.com/EverMind-AI/everos/compare/v1.1.3...v1.1.4
9511038
[1.1.3]: https://github.com/EverMind-AI/everos/compare/v1.1.2...v1.1.3
9521039
[1.1.2]: https://github.com/EverMind-AI/everos/compare/v1.1.1...v1.1.2

0 commit comments

Comments
 (0)