diff --git a/CHANGELOG.md b/CHANGELOG.md index a3c4081..2ccecb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,43 +4,6 @@ Hy Memory and MemHub are versioned and released independently. ## Unreleased -- SDK: `search(..., rerank=False)` skips every reranking stage for that one - call (the local cross-encoder, the memory-graph rerank, and the BM25 rerank of - working/coding facts), so results come back in retrieval-score order. The - flag travels on the read request, so concurrent searches do not affect each - other. The default (`True`) keeps current behavior; `/api/v1/search` accepts - it too. -- SDK: MMR diversity selection now runs only when the requested `limit` is - below 20 (`MMR_MAX_TOP_K`) and is skipped for larger limits, where its - quadratic token-overlap pass is slow and gains little. Previously it ran for - every limit. `MEMORY_HYBRID_V2_MMR_LAMBDA` still sets the weight. - Near-duplicate demotion follows the same gate: it compares each candidate - with every earlier non-duplicate, which is quadratic in a pool that grows - with `limit`, and large result pages should show similar items anyway. -- SDK: `search(scene="all")` searches chat, working and coding at the same time - and merges them with Reciprocal Rank Fusion (k=60) over each scene's own - ranking, so no scene is crowded out by the other scenes' score scales. Each - result says which scene and kind it came from. A scene that fails or is turned - off is reported in `errors` and does not fail the search. Source filters apply - to all three. -- SDK: `list_memories(scene="all")` lists chat, working and coding memories - together, newest update first, with `limit`/`offset` paging over the merged - order and `total` summing all three. `scene="coding"` and `"working"` now - honor `include_sources` / `exclude_sources`, and `total` counts only the - filtered memories. -- SDK: `update()` and `delete()` now work on working/coding experiences and - facts, not just chat memories. They take the same optional `kind` / `variant` - as `get()`, and an ID found in more than one place raises - `AmbiguousMemoryIdError` instead of guessing. Updating an experience replaces - its solution and keeps its task, unless a new `task=` is also passed; updating - a fact replaces its statement. Deleting removes the stored row and its vectors. -- SDK: `list_memories(scene="chat" | "coding" | "working")` lists one kind of - memory. `coding` and `working` list that scene's whole store, newest update - first (`workspace_id` still narrows it), and `total` is now the real count - rather than the page size. The new `memory_stats()` returns the count and the - latest created/updated time for each scene and their total, without reading - any memory text. Previously coding and working memories could not be listed - or counted without a workspace, so a library of 45 memories listed 22. - The SDK migration no longer fails its first run on a home with legacy vectors: reattaching them left a Chroma instance open with its own settings, and the readback that followed could not open the same store @@ -48,12 +11,6 @@ Hy Memory and MemHub are versioned and released independently. - MemHub "添加记忆" (add a memory) no longer waits behind unprocessed history. Notes are claimed ahead of the event-time window that keeps history strictly old to new; they still run one at a time and in order within their session. -- SDK reconcile keeps time order. Both reconcile prompts now state that only - `memory_at` decides which memory is newer, that an older memory must never - supersede or overwrite a newer one, and that an unknown time is not newer; - the Chinese prompt now lists `memory_at` among the new-memory fields. The - reconciler also enforces this in code: a SUPERSEDE or UPDATE aimed at a memory - with a later `memory_at` becomes an ADD, so the newer memory stays current. - The SDK memory page now reads its list, count, source and time labels and graph from one page response for one source filter, so rows, totals and the map no longer disagree. Memories with no recorded source are shown and @@ -111,6 +68,60 @@ Hy Memory and MemHub are versioned and released independently. `hy_node_permissions` proof table. Evidence, governed memories, model profiles, SDK stores, and source/host grants are preserved. +## Hy Memory 2.0.6 — 2026-10-27 + +- Published + [`hy-memory==2.0.6`](https://pypi.org/project/hy-memory/2.0.6/). +- `search(..., rerank=False)` skips every reranking stage for that one + call (the local cross-encoder, the memory-graph rerank, and the BM25 rerank of + working/coding facts), so results come back in retrieval-score order. The + flag travels on the read request, so concurrent searches do not affect each + other. The default (`True`) keeps current behavior; `/api/v1/search` accepts + it too. +- MMR diversity selection now runs only when the requested `limit` is + below 20 (`MMR_MAX_TOP_K`) and is skipped for larger limits, where its + quadratic token-overlap pass is slow and gains little. Previously it ran for + every limit. `MEMORY_HYBRID_V2_MMR_LAMBDA` still sets the weight. + Near-duplicate demotion follows the same gate: it compares each candidate + with every earlier non-duplicate, which is quadratic in a pool that grows + with `limit`, and large result pages should show similar items anyway. +- `search(scene="all")` searches chat, working and coding at the same time + and merges them with Reciprocal Rank Fusion (k=60) over each scene's own + ranking, so no scene is crowded out by the other scenes' score scales. Each + result says which scene and kind it came from. A scene that fails or is turned + off is reported in `errors` and does not fail the search. Source filters apply + to all three. +- `list_memories(scene="all")` lists chat, working and coding memories + together, newest update first, with `limit`/`offset` paging over the merged + order and `total` summing all three. `scene="coding"` and `"working"` now + honor `include_sources` / `exclude_sources`, and `total` counts only the + filtered memories. +- `update()` and `delete()` now work on working/coding experiences and + facts, not just chat memories. They take the same optional `kind` / `variant` + as `get()`, and an ID found in more than one place raises + `AmbiguousMemoryIdError` instead of guessing. Updating an experience replaces + its solution and keeps its task, unless a new `task=` is also passed; updating + a fact replaces its statement. Deleting removes the stored row and its vectors. +- `list_memories(scene="chat" | "coding" | "working")` lists one kind of + memory. `coding` and `working` list that scene's whole store, newest update + first (`workspace_id` still narrows it), and `total` is now the real count + rather than the page size. The new `memory_stats()` returns the count and the + latest created/updated time for each scene and their total, without reading + any memory text. Previously coding and working memories could not be listed + or counted without a workspace, so a library of 45 memories listed 22. +- Reconcile keeps time order. Both reconcile prompts now state that only + `memory_at` decides which memory is newer, that an older memory must never + supersede or overwrite a newer one, and that an unknown time is not newer; + the Chinese prompt now lists `memory_at` among the new-memory fields. The + reconciler also enforces this in code: a SUPERSEDE or UPDATE aimed at a memory + with a later `memory_at` becomes an ADD, so the newer memory stays current. +- The HTTP server returns 409 `ambiguous_memory_id` and 400 for a bad + `kind`/`variant` instead of 500, passes `kind`/`variant` (and `task` on PUT) + to get/update/delete, and no longer reads a PUT/DELETE query string as part + of the memory id. +- `memory_stats()` reads working/coding times, which are stored as naive UTC, + as UTC rather than local time. + ## Hy Memory 2.0.5 — 2026-10-22 - Published diff --git a/pyproject.toml b/pyproject.toml index 00e7abc..83a4bf0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "hy-memory" -version = "2.0.5" +version = "2.0.6" description = "HY Memory - Industrial-grade dual-system cognitive memory framework" readme = "README.md" requires-python = ">=3.9"