Releases: glasschan/qdrant-hermes-integration
Release list
v0.9.2
What's Changed
Code Fixes
- consolidation: paginate
_fetch_all_points()withnext_offsetloop - store: move
embedimport to top-level (no circular dep) - provider: add dual circuit breaker documentation
Tests
- 58 unit tests with conftest mocks for Hermes dependencies
- Covers: config validation, consolidation math, file indexing, store completeness scoring
Repo Cleanup
- Remove stale plan files (PLAN.md, PLAN_v0.6.md, ROADMAP.md)
- Remove tracked
__pycache__/*.pycfrom git - Update SKILL.md and README to reflect current state
- Strengthen .gitignore
Full Changelog: v0.9.0...v0.9.2
v0.9.0 — Production Hardening
v0.9.0 — Robustness, Smart Memory, Production Hardening
v0.7.0 — Robustness & Quality Guard
- Circuit breaker for embedding API (
EmbeddingCircuitBreakerinembeddings.py) - Priority-based search filter (
min_priorityparam onqdrant_search) - Memory evolution tracking (
evolved_fromfield onqdrant_remember) - Backfill tool (
qdrant_backfill— batch update missing fields on legacy points) - Quick consolidation mode (skip O(n²) dedup, stats only)
v0.8.0 — Smart Memory
- Topic clustering (new
clustering.py+qdrant_topicstool) - Auto-extract key facts at session end (smart filtering, priority=4)
- Smart prefetch (skip embedding call on short conversations <3 turns)
- Dedup quality score (completeness-based — keep richer memory)
v0.9.0 — Production Hardening
- Numpy batch cosine similarity (with pure-Python fallback)
- Incremental consolidation (track last run via metadata point)
- Memory lifecycle (
auto_stale+auto_prune, disabled by default) - Cross-session context bridge (first-turn priority memory injection)
- Config validation with range checks and fallback defaults
Bug Fixes (from v0.6.2)
- Hook double-fire dedup guard (Hermes dual-path instantiation)
- Dynamic VERSION read in system prompt
warnings.filterwarnings()instead of brokensimplefilter()- Stale detection:
priorityfield withimportancebackward compat - Consolidation metadata uses valid UUID (not string)
Stats
- 8 tools: profile, search, remember, forget, index, consolidate, backfill, topics
- Codebase: 2,579 → 3,927 lines (+1,348)
- Test: 25/25 scenarios pass (remember, dedup, min_priority, backfill, consolidation, clustering, forget, edge cases, incremental, profile, tags, stats)
v0.6.2 — Stale detection fix + hook dedup (redone)
Bug Fixes
- Stale detection fixed: Now reads
priorityfield with fallback toimportancefor legacy data. Old points without priority get importance→priority conversion. - Hook double-fire fixed: Dedup guard prevents hooks firing twice per turn when Hermes instantiates provider twice.
- Dynamic version:
system_prompt_block()reads VERSION file instead of hardcoded v0.6.0. - Scoped warnings:
catch_warnings()context manager instead of globalfilterwarnings().
Important
This is a redo of v0.6.2. The previous version incorrectly removed scope, learning_store, and scope branching. This version preserves ALL v0.6.1 self-healing features and only adds the correct fixes on top.
v0.6.1 — Hook-based lifecycle + garbage cleanup
v0.6.1 — Hook-based lifecycle + garbage cleanup + Ark embedding
Hook registration bypass
- Fixed: Hermes
_ProviderCollector.register_hook()was a silent no-op - Provider now directly writes to
PluginManager._hooksduringinitialize() - 3 hooks registered:
pre_llm_call,post_llm_call,on_session_end
Garbage cleanup
- Disabled auto-extraction of "Session topics" summaries (polluted search)
- Disabled "Session ended" markers (no value, session DB handles this)
- Cleaned 440 conversation entries from DB → 53 high-quality memories remain
Prefetch quality
- Category boost: conversation excluded (0.0x), corrections boosted (1.3x)
- Post-filter: min score 0.2, conversation category excluded
- Fetches
top_k * 3to avoid starving after filtering
Embedding model
- Switched back to Ark doubao-embedding-vision (from qwen3-embedding-4b)
- Recall improved 3-10x for Chinese queries
- Scores: 0.35-0.62 vs 0.01-0.16
Files changed
plugin.yaml— v0.6.1, addedprovides_hooks__init__.py— updated register() with documentationprovider.py— hook adapters, garbage cleanup, prefetch rework
v0.6.0 — Self-Healing Evolving Memory
Self-Healing Evolving Memory System
What's New
Phase 1: Enhanced Auto-Context Injection
- Prefetch top 8 (was 5) — broader memory surfacing per turn
- Category boost — corrections (1.3x), instructions (1.2x), preferences (1.15x) surface first
- Priority boost — P1/P2 memories get slight score bump
- Score threshold 0.4 — filters noise from low-relevance results
Phase 2: Correction Tagging + Priority
- New category:
correction— tag user behavior corrections - Priority field (1-5) — P1 = critical rule, P5 = low-priority fact
- Origin field — track how memory was created (user_correction, agent_discovery, explicit, auto)
- Payload indexes on priority + origin for fast filtered queries
Phase 3: Consolidation + Evolution
- Correction pattern detection — clusters corrections by topic, suggests skill extraction when 3+ on same topic
- Evolution suggestions — category imbalance, priority inflation, health checks
on_memory_writehook — mirrors local memory writes to Qdranton_session_endhook — auto-extracts session summaries
Config (all env-var overridable)
QDRANT_PREFETCH_TOP_K(default: 8)QDRANT_PREFETCH_SCORE_THRESHOLD(default: 0.4)QDRANT_CORRECTION_TOPIC_THRESHOLD(default: 3)QDRANT_SESSION_END_EXTRACT(default: true)
Backward Compatibility
Fully backward compatible with v0.5.0 data. Priority defaults to 3, origin defaults to 'explicit'.
Files Changed
config.py— new constants + config keysschemas.py— correction category, priority, origin fieldsstore.py— category boost, priority-aware storage, new payload indexesprovider.py— enhanced prefetch, on_memory_write, on_session_end, rich system promptconsolidation.py— correction patterns, evolution suggestionsVERSION+plugin.yaml— v0.6.0
v0.5.0 — Bug Fixes, Improvements & OpenRouter Support
Critical Fixes
- Dedup vector update:
store.add()now usesupsert()with the new vector instead ofset_payload(), ensuring search accuracy after dedup updates - get_all() pagination: Scroll-based pagination replaces the 100-result cap — no more silently truncated memory retrieval
- Removed dead learning.py: 258 lines of unused code eliminated
New Features
- OpenRouter embedding support: Added
dimensionsparameter to embedding requests, enabling models likeqwen/qwen3-embedding-4bwith custom output dimensions - Tag filtering in search:
qdrant_searchnow accepts optionaltagsparameter (AND logic) - Embedding retry with backoff: 3 attempts with exponential backoff (1s, 2s, 4s) — no more single-point failures
- Embedding dimension validation: Catches vector dimension mismatches before upsert
Improvements
- Added
Store.clientproperty for proper encapsulation logger.warning()replaces 5 silentexcept: passblocks_load_manifest()skips vectors (with_vectors=False)_find_stale_ids()batched into single Qdrant query (O(1) vs O(N))- Secret detection uses regex patterns (fewer false positives)
- Fixed CLI status tool count (10 → 6)
- Removed unused
_max_chunk_tokensconfig
Upgrade
curl -sL https://raw.githubusercontent.com/glasschan/qdrant-hermes-integration/main/setup.sh | bash -s -- --updateFull Changelog: v0.4.1...v0.5.0
v0.4.1 — Self-healing + simplified install
What's New
Self-healing namespace bug fix
Hermes has a bug where user-installed memory provider plugins fail with ModuleNotFoundError: No module named '_hermes_user_memory'. The plugin now automatically detects and fixes this at load time — no Hermes patches, no dual-path install, no config changes needed.
Simplified install
- Single path install — just
~/.hermes/plugins/hermes-memory-qdrant/, no bundled-path copy needed - Backups moved to
~/.hermes/plugin-backups/to avoid version hijack by alphabetical dedup - plugins.enabled auto-config via Python to avoid the JSON-string YAML bug in
hermes config set
Documentation
- Complete README rewrite — features, install, tools, CLI, env vars, architecture, safety, memory hygiene
- SKILL.md updated with self-healing docs + troubleshooting
- All dual-path references removed
What's Fixed (from v0.4.0)
_hermes_user_memorynamespace not registered → self-healing in__init__.py- Backup dirs in
~/.hermes/plugins/hijacking version → moved to~/.hermes/plugin-backups/ - Complex dual-path install → single path, one-liner still works
v0.3.0 — Memory hygiene: dedup, tags, recency search, 6 tools
What's New
🧹 Memory Hygiene (major)
- Pre-save dedup:
qdrant_rememberauto-detects semantically similar content (>0.85) and updates existing entry instead of creating duplicates - Payload metadata: every point now has
created_at+updated_at+versionfor full audit trail - Tags support: optional string array on
qdrant_rememberfor filtered retrieval - Recency-weighted search:
qdrant_searchaccepts optionalrecency_weightparam (0.0-1.0) to blend freshness with relevance
🗑️ Noise Reduction
sync_turn()OFF by default — no more auto-saved conversation garbage- Removed Learning Store (4 unused tools) — saves token overhead
⚡ Performance
- Auto-payload-indexes on
category(keyword) andupdated_at(integer) for fast filtered queries - Search fetches extra results + re-ranks for recency blending
🛠️ Config
All new features configurable via env vars:
QDRANT_DEDUP_THRESHOLD(default: 0.85)QDRANT_DEDUP_ENABLED(default: true)QDRANT_AUTO_SYNC(default: false)QDRANT_RECENCY_WEIGHT(default: 0.0)
📦 Tools: 10 → 6
Removed: qdrant_learning_store, qdrant_learning_search, qdrant_learning_preview, qdrant_learning_approve
v0.2.1 — Official CLI pattern, hooks field, bug fixes
v0.2.1 (Patch)
Changes since v0.2.0
- CLI refactored to official Hermes subcommand pattern:
status,version,update(instead of--flags) plugin.yamlnow declareshooks: [sync_turn]per official spec- Same-version skip fix:
setup.sh --updatecorrectly skips when current == latest - Piped mode fix:
curl ... | bash -s -- --updatedownloads via GitHub tarball
CLI Usage
hermes hermes-memory-qdrant status # Plugin config + env vars
hermes hermes-memory-qdrant version # Current vs latest
hermes hermes-memory-qdrant update # Upgrade from CLIv0.2.0 — User-installed path, update mechanism, CLI subcommands
🏗️ Install Path Change
Plugin now installs to ~/.hermes/plugins/hermes-memory-qdrant/ (user-installed path) instead of the old bundled path. Aligns with official Hermes direction for standalone memory providers.
Existing users: re-run setup.sh to migrate — old bundled copy is cleaned up.
🆕 New Features
Update Mechanism
# Check for update and upgrade
curl -sL https://raw.githubusercontent.com/glasschan/qdrant-hermes-integration/main/setup.sh | bash -s -- --update
# Force reinstall
curl -sL https://raw.githubusercontent.com/glasschan/qdrant-hermes-integration/main/setup.sh | bash -s -- --forceCLI Subcommands (official Hermes pattern)
hermes hermes-memory-qdrant status # Plugin config + env vars
hermes hermes-memory-qdrant version # Current vs latest
hermes hermes-memory-qdrant update # Upgrade from CLIVersion Tracking
plugin/VERSION— plaintext file for easy parsingplugin.yamlbumped to 0.2.0 withhooks:field
🐛 Bug Fixes
- Same-version detection:
--updatenow correctly skips when current == latest - Piped mode:
curl ... | bash -s -- --updatenow works via GitHub tarball download - CLI subcommands follow official
register_cli(subparser)pattern
📦 Files Changed
| File | Change |
|---|---|
setup.sh |
New PLUGIN_DIR path, --update/--force flags, version comparison, piped-mode download |
README.md |
Install paths, Updating section, subcommand docs |
SKILL.md |
Updated for new paths and architecture |
plugin/cli.py |
New — subcommands: status, version, update |
plugin/VERSION |
New — plaintext version file |
plugin/plugin.yaml |
Bumped 0.1.0 → 0.2.0 + hooks field |