v0.2.23

sadmann7/tablecnv0.2.23Sep 24, 2026by het0814

Upgrading?

AI Summary

This release introduces new migration sources for Zep and Hindsight, adds community-contributed OKF showcases, and significantly improves the latency of unfiltered recall queries.

Key Highlights

  • New `memanto migrate zep` and `hindsight` commands with support for API keys, file exports, and dry-runs.
  • Web UI integration for Zep and Hindsight migration cards, including support for self-hosted Hindsight servers.
  • Improved unfiltered recall performance by removing over-fetching on plain searches.
  • Five new community-contributed migration showcases in the `examples/migrations/` directory.

New Features

  • Zep migration support with cursor-based pagination and stale knowledge filtering.
  • Hindsight migration support with base URL configuration and fact-type mapping.
  • OKF migration showcases for ChatGPT, Claude, Antigravity, LangMem, and MCP Memory Server.

Full Release Notes

# Release Notes for v0.2.23

This release adds two new migration sources to `memanto migrate`, Zep and Hindsight, in both the CLI and the web UI. It also adds five community-contributed OKF migration showcases under `examples/migrations/`. On the recall side, unfiltered recall queries no longer over-fetch candidates, which removes a latency cost on plain searches.

## New Features
- **Zep migration** (`memanto/cli/commands/migrate.py`, `memanto/cli/analyze/zep_export.py`, `memanto/cli/migrate/mappers.py`)
  - New `memanto migrate zep` command with `--api-key` (env `ZEP_API_KEY`, saved to `~/.memanto/.env`), `--file`, `--agent`, and `--dry-run`.
  - The live export uses only `httpx` (no `zep-cloud` SDK). It pages through every user via `/api/v2/users-ordered` and pulls each user's knowledge-graph edges with cursor pagination. Page caps make it fail loudly instead of looping forever.
  - Facts Zep has superseded (`expired_at`) or that are no longer true (`invalid_at` in the past) are skipped so stale knowledge isn't brought back. A future `invalid_at` is still imported.
  - Each memory is tagged `user=<zep user id>` plus the relation name. `created_at` comes from `valid_at` (falling back to `created_at`). The memory type is left for the parser to classify instead of being set to `fact`.
  - Relation endpoints, validity window, attributes, and episode count are kept in a supporting-data footer.
- **Hindsight migration** (`memanto/cli/commands/migrate.py`, `memanto/cli/analyze/hindsight_export.py`, `memanto/cli/migrate/mappers.py`)
  - New `memanto migrate hindsight` command with `--api-key` (env `HINDSIGHT_API_KEY`), `--base-url` (env `HINDSIGHT_BASE_URL`, saved for later runs), `--file`, `--agent`, and `--dry-run`.
  - Works with Hindsight Cloud (the default, `https://api.hindsight.vectorize.io`) or a self-hosted server. A bare hostname gets `https://`, except local hosts, which get `http://`.
  - Exports every bank's memory units using limit/offset pagination. Units a user marked invalidated are skipped.
  - Hindsight fact networks map to Memanto types: `world` → `fact`, `experience` → `event`, `observation` → `observation`. `created_at` prefers when the fact happened (`occurred_start`) over when it was ingested. Titles use only the "what" part of Hindsight's `what | When: … | Involving: …` text.
  - Each memory is tagged `bank=<bank id>` plus its original tags. Context, entities, occurrence window, proof count, document id, and metadata go into the supporting-data footer.
  - Tags for both providers are bounded: tags over 64 characters, tags containing commas, or tags beyond the 20-tag cap move to an "Extra tags" footer line. This way one oversized tag list can't fail validation for the whole write batch.
- **Zep and Hindsight in the web UI migrate page** (`memanto/app/ui/routes/ui_router.py`, `memanto/app/ui/static/index.html`)
  - Both providers appear as migration cards with icons, docs links, and API-key placeholders (`z_...`, `hsk_...`).
  - Hindsight has an optional **Server URL** field for self-hosted instances. Leaving it blank uses Hindsight Cloud.
  - Savings tiles are hidden for Zep and Hindsight, which have no savings report.
- **OKF migration showcases** (`examples/migrations/`)
  - `chatgpt-claude-okf`: turns an official ChatGPT or Claude data export into an OKF v0.2 bundle for `memanto migrate okf`. Includes a privacy filter and a parity check.
  - `antigravity-brain`: migrates Antigravity brain archives (implementation-plan and walkthrough revisions) through OKF, with live round-trip validation.
  - `9-migration-adapters`: reference adapters for ChatGPT, Claude, Gemini, Zep, Hindsight, LangGraph, Notion, Obsidian, Chroma, Mem0, Supermemory, and Letta. Includes a Streamlit app, sample exports, and a generated OKF bundle.
  - `langmem`: LangMem → Memanto migration via OKF, with a validation report.
  - `mcp-memory-server`: migrates official MCP Memory Server knowledge graphs to portable OKF. Includes a guarded live demo and round-trip validation.

## Improvements
- **Faster unfiltered recall** (`memanto/app/services/memory_read_service.py`)
  - Recall now over-fetches up to Moorcheh's hard cap only when a post-retrieval filter is requested (`created_after`, `created_before`, `min_confidence`, or `status` other than `all`).
  - Plain queries now fetch only the requested number of results, which removes the p95 latency cost on simple recall.
- **Clearer skip reporting in migrations** (`memanto/cli/commands/migrate.py`, `memanto/app/ui/static/index.html`)
  - The CLI summary and the UI preview/summary tiles now say skipped rows were "empty or invalidated" instead of only "empty".

## Tests
- `tests/test_migrate_zep_hindsight.py`: 12 tests. Cover Zep current-vs-expired filtering, Hindsight fact-type mapping and invalidated-unit skipping, tag bounding, title cleanup, and base-URL normalization.
- `tests/test_chatgpt_claude_okf.py`: offline coverage of the ChatGPT/Claude OKF adapter. Covers export parsing for both vendors, the privacy filter, bundle round-trip, and stale-bundle cleanup.
- `tests/test_memory_read_temporal_recall.py`: now asserts that an unfiltered query fetches exactly `limit` candidates instead of widening the pool.

## Full Changelog
Full Changelog: https://github.com/moorcheh-ai/memanto/compare/v0.2.22...v0.2.23

Related Repositories