hy-memory 2.0.5.dev1__tar.gz → 2.0.5.dev3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hy_memory-2.0.5.dev1/hy_memory.egg-info → hy_memory-2.0.5.dev3}/PKG-INFO +1 -1
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/client.py +272 -2
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3/hy_memory.egg-info}/PKG-INFO +1 -1
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/pyproject.toml +1 -1
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/LICENSE +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/MANIFEST.in +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/README.md +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/__init__.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/__init__.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/abstractor.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/emotion_analyzer.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/episode_summary.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/extractor.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/intention_detector.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/llm_provider.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/mem_agent.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/prompts_zh.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/reconciler.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/reflector.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/tools/__init__.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/tools/base.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/tools/basic_profile.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/__init__.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/chain_store.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/extractor.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/fact_reconciler.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/judge.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/lexical.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/preproc.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/prompts_zh.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/reconciler.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/store.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/types.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/writer.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/config.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/core/__init__.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/core/embed_service.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/core/merger.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/core/scorer.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/core/workload.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/__init__.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/cache.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/cache_base.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/cache_mysql.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/cache_sqlite.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/graph_store.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/graph_store_base.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/graph_store_kuzu.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/graph_store_neo4j.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/history_store.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/kv_store.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/rdb.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/vector_store.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/vector_store_base.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/vector_store_chroma.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/vector_store_faiss.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/vector_store_qdrant.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/inspector.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/metrics.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/models/__init__.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/models/memory.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/models/requests.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/__init__.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_graph/__init__.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_graph/projector.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_graph/rerank.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_graph/topic_summary.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/__init__.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/bm25.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/bm25_fastembed.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/candidate_guards.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/config.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/date_view.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/dedup.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/diversity.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/entities.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/entity_store.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/evolution.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/hierarchy_bundle.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/intent.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/intention.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/lemmatize.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/local_rerank.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/memory_format.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/multi_seed_bundle.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/ner.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/profile_evidence.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/profile_owner_gate.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/query_expand.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/reconcile_retrieval.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/record_date_view.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/retrieval_clauses.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/rrf.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/scoring.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/series_tail_guard.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/session_episode.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/strength.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/supplemental_propositions.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/tag_index.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/temporal.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/topic_candidates.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/trace.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/underflow.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/user_level_l0.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/balanced_catalog.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/base.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/cross_domain_sweeper.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/reader.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/reader_base.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/reader_hybrid.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/reader_legacy.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/registry.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/specific_supplement.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/system2_agent.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/system2_tools.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/system2_writer.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/user_profile_scope.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/writer.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/runtime.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/server.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/snapshot.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/structure.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/async_executor.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/clone_references.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/keyword_ties.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/lang_detect.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/log_setup.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/metrics.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/model_call_context.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/pipeline_log_writer.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/pipeline_observability.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/source_filter.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/time_window.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/token_count.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/trace_file_writer.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/tracer.py +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory.egg-info/SOURCES.txt +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory.egg-info/dependency_links.txt +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory.egg-info/requires.txt +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory.egg-info/top_level.txt +0 -0
- {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/setup.cfg +0 -0
|
@@ -2936,6 +2936,49 @@ class HyMemoryClient:
|
|
|
2936
2936
|
include_runtime_diag=True,
|
|
2937
2937
|
)
|
|
2938
2938
|
|
|
2939
|
+
def import_memory_exact(
|
|
2940
|
+
self,
|
|
2941
|
+
content: str,
|
|
2942
|
+
*,
|
|
2943
|
+
memory_id: str,
|
|
2944
|
+
user_id: str,
|
|
2945
|
+
agent_id: str = "default_agent",
|
|
2946
|
+
session_id: str = "default_session",
|
|
2947
|
+
source: str = "default",
|
|
2948
|
+
layer: Any = "l2_fact",
|
|
2949
|
+
status: Any = "active",
|
|
2950
|
+
owner: Optional[str] = None,
|
|
2951
|
+
tags: Optional[List[str]] = None,
|
|
2952
|
+
supersedes: Optional[List[str]] = None,
|
|
2953
|
+
superseded_by: Optional[List[str]] = None,
|
|
2954
|
+
is_latest: bool = True,
|
|
2955
|
+
memory_at: Optional[datetime] = None,
|
|
2956
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
2957
|
+
request_id: Optional[str] = None,
|
|
2958
|
+
) -> Dict[str, Any]:
|
|
2959
|
+
"""Import one existing semantic memory without extraction/reconcile."""
|
|
2960
|
+
return self._loop_thread.run(
|
|
2961
|
+
self.async_import_memory_exact(
|
|
2962
|
+
content,
|
|
2963
|
+
memory_id=memory_id,
|
|
2964
|
+
user_id=user_id,
|
|
2965
|
+
agent_id=agent_id,
|
|
2966
|
+
session_id=session_id,
|
|
2967
|
+
source=source,
|
|
2968
|
+
layer=layer,
|
|
2969
|
+
status=status,
|
|
2970
|
+
owner=owner,
|
|
2971
|
+
tags=tags,
|
|
2972
|
+
supersedes=supersedes,
|
|
2973
|
+
superseded_by=superseded_by,
|
|
2974
|
+
is_latest=is_latest,
|
|
2975
|
+
memory_at=memory_at,
|
|
2976
|
+
metadata=metadata,
|
|
2977
|
+
request_id=request_id,
|
|
2978
|
+
),
|
|
2979
|
+
include_runtime_diag=True,
|
|
2980
|
+
)
|
|
2981
|
+
|
|
2939
2982
|
def get_raw(self, raw_id: str) -> Optional[Dict[str, Any]]:
|
|
2940
2983
|
"""Read one SDK raw record through the explicit raw API."""
|
|
2941
2984
|
return self._loop_thread.run(self.async_get_raw(raw_id))
|
|
@@ -3223,6 +3266,157 @@ class HyMemoryClient:
|
|
|
3223
3266
|
raise RuntimeError("raw import changed the requested identity")
|
|
3224
3267
|
return {"success": True, "raw_id": node_id, "request_id": request_id}
|
|
3225
3268
|
|
|
3269
|
+
@_ensure_internal_loop
|
|
3270
|
+
async def async_import_memory_exact(
|
|
3271
|
+
self,
|
|
3272
|
+
content: str,
|
|
3273
|
+
*,
|
|
3274
|
+
memory_id: str,
|
|
3275
|
+
user_id: str,
|
|
3276
|
+
agent_id: str = "default_agent",
|
|
3277
|
+
session_id: str = "default_session",
|
|
3278
|
+
source: str = "default",
|
|
3279
|
+
layer: Any = "l2_fact",
|
|
3280
|
+
status: Any = "active",
|
|
3281
|
+
owner: Optional[str] = None,
|
|
3282
|
+
tags: Optional[List[str]] = None,
|
|
3283
|
+
supersedes: Optional[List[str]] = None,
|
|
3284
|
+
superseded_by: Optional[List[str]] = None,
|
|
3285
|
+
is_latest: bool = True,
|
|
3286
|
+
memory_at: Optional[datetime] = None,
|
|
3287
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
3288
|
+
request_id: Optional[str] = None,
|
|
3289
|
+
) -> Dict[str, Any]:
|
|
3290
|
+
"""Import a canonical memory node exactly, with no model invocation."""
|
|
3291
|
+
from .models.memory import MemoryLayer, MemoryStatus
|
|
3292
|
+
from .utils.source_filter import normalize_source
|
|
3293
|
+
|
|
3294
|
+
if not content or not memory_id or not user_id:
|
|
3295
|
+
raise ValueError("content, memory_id and user_id are required")
|
|
3296
|
+
normalized_layer = (
|
|
3297
|
+
layer if isinstance(layer, MemoryLayer) else MemoryLayer.from_string(str(layer))
|
|
3298
|
+
)
|
|
3299
|
+
if normalized_layer == MemoryLayer.L1_RAW:
|
|
3300
|
+
raise ValueError("use import_raw for L1_RAW")
|
|
3301
|
+
normalized_status = (
|
|
3302
|
+
status if isinstance(status, MemoryStatus) else MemoryStatus(str(status).lower())
|
|
3303
|
+
)
|
|
3304
|
+
request_id = request_id or str(uuid.uuid4())
|
|
3305
|
+
replay = await self._claim_write_outcome(
|
|
3306
|
+
request_id=request_id,
|
|
3307
|
+
user_id=user_id,
|
|
3308
|
+
agent_id=agent_id,
|
|
3309
|
+
session_id=session_id,
|
|
3310
|
+
operation="import_memory_exact",
|
|
3311
|
+
)
|
|
3312
|
+
if replay is not None:
|
|
3313
|
+
return replay
|
|
3314
|
+
try:
|
|
3315
|
+
result = await self._async_import_memory_exact_impl(
|
|
3316
|
+
content,
|
|
3317
|
+
memory_id=memory_id,
|
|
3318
|
+
user_id=user_id,
|
|
3319
|
+
agent_id=agent_id,
|
|
3320
|
+
session_id=session_id,
|
|
3321
|
+
source=normalize_source(source),
|
|
3322
|
+
layer=normalized_layer,
|
|
3323
|
+
status=normalized_status,
|
|
3324
|
+
owner=owner,
|
|
3325
|
+
tags=tags or [],
|
|
3326
|
+
supersedes=supersedes or [],
|
|
3327
|
+
superseded_by=superseded_by or [],
|
|
3328
|
+
is_latest=is_latest,
|
|
3329
|
+
memory_at=memory_at,
|
|
3330
|
+
metadata=metadata,
|
|
3331
|
+
request_id=request_id,
|
|
3332
|
+
)
|
|
3333
|
+
except BaseException:
|
|
3334
|
+
await self._mark_write_outcome_unknown(request_id)
|
|
3335
|
+
raise
|
|
3336
|
+
await self._finish_write_outcome(request_id, "succeeded", result)
|
|
3337
|
+
return result
|
|
3338
|
+
|
|
3339
|
+
async def _async_import_memory_exact_impl(
|
|
3340
|
+
self,
|
|
3341
|
+
content: str,
|
|
3342
|
+
*,
|
|
3343
|
+
memory_id: str,
|
|
3344
|
+
user_id: str,
|
|
3345
|
+
agent_id: str,
|
|
3346
|
+
session_id: str,
|
|
3347
|
+
source: str,
|
|
3348
|
+
layer,
|
|
3349
|
+
status,
|
|
3350
|
+
owner: Optional[str],
|
|
3351
|
+
tags: List[str],
|
|
3352
|
+
supersedes: List[str],
|
|
3353
|
+
superseded_by: List[str],
|
|
3354
|
+
is_latest: bool,
|
|
3355
|
+
memory_at: Optional[datetime],
|
|
3356
|
+
metadata: Optional[Dict[str, Any]],
|
|
3357
|
+
request_id: str,
|
|
3358
|
+
) -> Dict[str, Any]:
|
|
3359
|
+
from .models.memory import MemoryNode, SourceType
|
|
3360
|
+
|
|
3361
|
+
existing = await self._vector_store.get_by_id(memory_id)
|
|
3362
|
+
if existing is not None:
|
|
3363
|
+
identity = (
|
|
3364
|
+
existing.content == content,
|
|
3365
|
+
existing.user_id == user_id,
|
|
3366
|
+
existing.agent_id == agent_id,
|
|
3367
|
+
existing.session_id == session_id,
|
|
3368
|
+
existing.source == source,
|
|
3369
|
+
existing.layer == layer,
|
|
3370
|
+
existing.status == status,
|
|
3371
|
+
existing.owner == owner,
|
|
3372
|
+
list(existing.tags or []) == tags,
|
|
3373
|
+
list(existing.supersedes or []) == supersedes,
|
|
3374
|
+
list(existing.superseded_by or []) == superseded_by,
|
|
3375
|
+
existing.is_latest == is_latest,
|
|
3376
|
+
)
|
|
3377
|
+
if not all(identity):
|
|
3378
|
+
raise ValueError("memory_id is already bound to different memory content")
|
|
3379
|
+
return {
|
|
3380
|
+
"success": True,
|
|
3381
|
+
"memory_id": memory_id,
|
|
3382
|
+
"memory_ids": [memory_id],
|
|
3383
|
+
"request_id": request_id,
|
|
3384
|
+
"replayed": True,
|
|
3385
|
+
}
|
|
3386
|
+
|
|
3387
|
+
custom = dict(metadata or {})
|
|
3388
|
+
custom["request_id"] = request_id
|
|
3389
|
+
custom["input_kind"] = "memory_exact_import"
|
|
3390
|
+
embedding = await self._embed_service.embed(content)
|
|
3391
|
+
node = MemoryNode(
|
|
3392
|
+
node_id=memory_id,
|
|
3393
|
+
user_id=user_id,
|
|
3394
|
+
agent_id=agent_id,
|
|
3395
|
+
session_id=session_id,
|
|
3396
|
+
source=source,
|
|
3397
|
+
layer=layer,
|
|
3398
|
+
content=content,
|
|
3399
|
+
source_type=SourceType.EXPLICIT,
|
|
3400
|
+
status=status,
|
|
3401
|
+
owner=owner,
|
|
3402
|
+
tags=list(tags),
|
|
3403
|
+
supersedes=list(supersedes),
|
|
3404
|
+
superseded_by=list(superseded_by),
|
|
3405
|
+
is_latest=is_latest,
|
|
3406
|
+
embedding=embedding,
|
|
3407
|
+
memory_at=memory_at,
|
|
3408
|
+
custom=custom,
|
|
3409
|
+
)
|
|
3410
|
+
stored_id = await self._vector_store.upsert(node)
|
|
3411
|
+
if stored_id != memory_id:
|
|
3412
|
+
raise RuntimeError("exact memory import changed the requested identity")
|
|
3413
|
+
return {
|
|
3414
|
+
"success": True,
|
|
3415
|
+
"memory_id": memory_id,
|
|
3416
|
+
"memory_ids": [memory_id],
|
|
3417
|
+
"request_id": request_id,
|
|
3418
|
+
}
|
|
3419
|
+
|
|
3226
3420
|
@_ensure_internal_loop
|
|
3227
3421
|
async def async_get_raw(self, raw_id: str) -> Optional[Dict[str, Any]]:
|
|
3228
3422
|
from .models.memory import MemoryLayer
|
|
@@ -3275,6 +3469,66 @@ class HyMemoryClient:
|
|
|
3275
3469
|
"offset": offset,
|
|
3276
3470
|
}
|
|
3277
3471
|
|
|
3472
|
+
async def _search_explicit_raw_layer(
|
|
3473
|
+
self,
|
|
3474
|
+
query: str,
|
|
3475
|
+
*,
|
|
3476
|
+
user_ids: List[str],
|
|
3477
|
+
agent_ids: List[str],
|
|
3478
|
+
session_ids: List[str],
|
|
3479
|
+
include_sources: List[str],
|
|
3480
|
+
exclude_sources: List[str],
|
|
3481
|
+
limit: int,
|
|
3482
|
+
min_score: float,
|
|
3483
|
+
created_after: Optional[float],
|
|
3484
|
+
request_id: str,
|
|
3485
|
+
t0: float,
|
|
3486
|
+
query_embedding: Optional[List[float]],
|
|
3487
|
+
) -> Dict[str, Any]:
|
|
3488
|
+
"""Implement `search(..., layers=['l1_raw'])` without a second API."""
|
|
3489
|
+
from .models.memory import MemoryLayer, MemoryStatus
|
|
3490
|
+
|
|
3491
|
+
embedding = query_embedding or await self._embed_service.embed(query)
|
|
3492
|
+
fetch = min(max(limit * (10 if session_ids else 2), limit), 10_000)
|
|
3493
|
+
hits = await self._vector_store.search(
|
|
3494
|
+
query_embedding=embedding,
|
|
3495
|
+
user_ids=user_ids,
|
|
3496
|
+
agent_ids=agent_ids,
|
|
3497
|
+
include_sources=include_sources,
|
|
3498
|
+
exclude_sources=exclude_sources,
|
|
3499
|
+
layers=[MemoryLayer.L1_RAW],
|
|
3500
|
+
limit=fetch,
|
|
3501
|
+
score_threshold=min_score,
|
|
3502
|
+
status_filter=[MemoryStatus.ACTIVE],
|
|
3503
|
+
only_latest=False,
|
|
3504
|
+
created_after=created_after,
|
|
3505
|
+
)
|
|
3506
|
+
sessions = set(session_ids)
|
|
3507
|
+
rows: List[Dict[str, Any]] = []
|
|
3508
|
+
for hit in hits:
|
|
3509
|
+
node = hit.get("node")
|
|
3510
|
+
if node is None or node.layer != MemoryLayer.L1_RAW:
|
|
3511
|
+
continue
|
|
3512
|
+
if sessions and node.session_id not in sessions:
|
|
3513
|
+
continue
|
|
3514
|
+
row = self._raw_node_to_public(node)
|
|
3515
|
+
rows.append(
|
|
3516
|
+
{
|
|
3517
|
+
"memory_id": row.pop("raw_id"),
|
|
3518
|
+
**row,
|
|
3519
|
+
"layer": MemoryLayer.L1_RAW.value,
|
|
3520
|
+
"status": MemoryStatus.ACTIVE.value,
|
|
3521
|
+
"score": round(float(hit.get("score", 0.0)), 4),
|
|
3522
|
+
}
|
|
3523
|
+
)
|
|
3524
|
+
if len(rows) >= limit:
|
|
3525
|
+
break
|
|
3526
|
+
return {
|
|
3527
|
+
"request_id": request_id,
|
|
3528
|
+
"memories": {"schema": [], "proactive": [], "normal": rows},
|
|
3529
|
+
"elapsed_ms": round((time.perf_counter() - t0) * 1000, 2),
|
|
3530
|
+
}
|
|
3531
|
+
|
|
3278
3532
|
@staticmethod
|
|
3279
3533
|
def _public_search_views(
|
|
3280
3534
|
result_memories: List[Dict[str, Any]],
|
|
@@ -3935,6 +4189,22 @@ class HyMemoryClient:
|
|
|
3935
4189
|
effective_search_layers = [MemoryLayer.L1_RAW] if lite_mode else layers
|
|
3936
4190
|
effective_schema_limit = 0 if lite_mode else schema_limit
|
|
3937
4191
|
effective_intention_limit = 0 if lite_mode else intention_limit
|
|
4192
|
+
normalized_search_layers = self._normalize_layers(effective_search_layers)
|
|
4193
|
+
if normalized_search_layers == [MemoryLayer.L1_RAW]:
|
|
4194
|
+
return await self._search_explicit_raw_layer(
|
|
4195
|
+
effective_target_query,
|
|
4196
|
+
user_ids=effective_user_ids,
|
|
4197
|
+
agent_ids=effective_agent_ids,
|
|
4198
|
+
session_ids=effective_session_ids,
|
|
4199
|
+
include_sources=effective_include_sources,
|
|
4200
|
+
exclude_sources=effective_exclude_sources,
|
|
4201
|
+
limit=limit,
|
|
4202
|
+
min_score=min_score,
|
|
4203
|
+
created_after=effective_created_after,
|
|
4204
|
+
request_id=request_id,
|
|
4205
|
+
t0=t0,
|
|
4206
|
+
query_embedding=query_embedding,
|
|
4207
|
+
)
|
|
3938
4208
|
|
|
3939
4209
|
read_req = ReadRequest(
|
|
3940
4210
|
query=effective_target_query,
|
|
@@ -3955,7 +4225,7 @@ class HyMemoryClient:
|
|
|
3955
4225
|
layers=(
|
|
3956
4226
|
[
|
|
3957
4227
|
layer.value
|
|
3958
|
-
for layer in
|
|
4228
|
+
for layer in normalized_search_layers
|
|
3959
4229
|
]
|
|
3960
4230
|
if effective_search_layers else None
|
|
3961
4231
|
),
|
|
@@ -3980,7 +4250,7 @@ class HyMemoryClient:
|
|
|
3980
4250
|
_wanted_layers = (
|
|
3981
4251
|
{
|
|
3982
4252
|
layer.value
|
|
3983
|
-
for layer in
|
|
4253
|
+
for layer in normalized_search_layers
|
|
3984
4254
|
}
|
|
3985
4255
|
if effective_search_layers else None
|
|
3986
4256
|
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/bm25_fastembed.py
RENAMED
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/candidate_guards.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/entity_store.py
RENAMED
|
File without changes
|
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/hierarchy_bundle.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/local_rerank.py
RENAMED
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/memory_format.py
RENAMED
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/multi_seed_bundle.py
RENAMED
|
File without changes
|
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/profile_evidence.py
RENAMED
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/profile_owner_gate.py
RENAMED
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/query_expand.py
RENAMED
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/reconcile_retrieval.py
RENAMED
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/record_date_view.py
RENAMED
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/retrieval_clauses.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/series_tail_guard.py
RENAMED
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/session_episode.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/topic_candidates.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/user_level_l0.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|