-
Notifications
You must be signed in to change notification settings - Fork 290
Description
[API + Memory] GET /api/v1/memories does not return full episode + episode.summary falls back to content[:200]
Issue Body(English Version - Recommended to post this)
Problem Description
While using EverMemOS for benchmarking and third-party integrations, I discovered two clear design/implementation inconsistencies in the /api/v1/memories interface. These issues prevent external users from seeing the true episodic content:
-
GET /api/v1/memories does not return the complete
episodefield
The interface only returns a lightweight version containingtitleandsummary, while the coreepisode(the full content actually used by internal retrieval, BM25, rerank, and LLM) is not exposed at all. -
episode.summary is low quality and actually degenerates into
content[:200]
The system does not instruct the LLM to generate a real summary, nor does it reuse the upstreamMemCell.summary. Instead, it directly falls back to truncating the first 200 characters of the content.
Reproduction Steps
- Call
GET /api/v1/memories - Check any returned memory entry
- Compare the internally stored
episodic_memory.episodewith the returnedsummary
Evidence Chain (verified on latest main branch)
Issue 1: episode not exported
src/agentic_layer/fetch_mem_service.py: The conversion function only usesEpisodicMemoryModeland maps onlytitleandsummary— noepisodeor full content is included.src/api_specs/memory_models.py: TheEpisodicMemoryModeldefinition does not even contain anepisodefield.- Internal retrieval heavily relies on the full episode (
src/agentic_layer/agentic_utils.py:146,src/agentic_layer/retrieval_utils.py:88). - The storage layer clearly holds the complete content (
src/infra_layer/adapters/out/persistence/document/memory/episodic_memory.py:29).
Issue 2: summary fallback
src/memory_layer/prompts/en/episode_mem_prompts.py: The episode extraction prompt only asks fortitle+content— nosummaryfield is mentioned.src/memory_layer/memory_extractor/episode_memory_extractor.py(in the_extract_episodefunction):if "summary" not in data or not data["summary"]: data["summary"] = data["content"][:200] # ← This is the source of the pseudo-summary
- The upstream boundary detection already generates a high-quality
MemCell.summary(src/memory_layer/memcell_extractor/conv_memcell_extractor.py:641), but the episode pipeline never reuses it.
Impact
- External benchmarks, audits, and third-party systems cannot see the real memory content
- Users mistakenly treat
summaryas the complete memory, severely degrading integration quality - Strong internal capabilities (full episode) vs. weak external contract → inconsistent experience
Suggested Fix (for reference)
- Short-term: Add a query parameter
?full=truetoGET /api/v1/memoriesto optionally return the fullepisodefield (backward compatible). - Medium/long-term:
- Update the episode prompt to explicitly request a high-quality
summary - In the extractor, prioritize reusing
MemCell.summary(with fallback as last resort) - Extend
EpisodicMemoryModelto include an optionalepisodefield
- Update the episode prompt to explicitly request a high-quality
This improvement would be extremely valuable for all external users (especially those doing benchmarks). Looking forward to the team's thoughts and feedback!
Additional Information
- Environment: Latest main branch (March 2026)