From d4fd393f523f151cc63edeb6b0093cc100a5ad21 Mon Sep 17 00:00:00 2001 From: serversdwn Date: Mon, 15 Dec 2025 01:56:57 -0500 Subject: [PATCH] autonomy phase 2.5 - tightening up some stuff in the pipeline --- cortex/data/self_state.json | 6 ++-- cortex/router.py | 3 +- neomem/neomem/vector_stores/qdrant.py | 50 +++++++++++++++++++++++---- 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/cortex/data/self_state.json b/cortex/data/self_state.json index b9fc83f..56d5ae5 100644 --- a/cortex/data/self_state.json +++ b/cortex/data/self_state.json @@ -3,9 +3,9 @@ "energy": 0.8, "focus": "user_request", "confidence": 0.7, - "curiosity": 0.7000000000000002, - "last_updated": "2025-12-14T19:29:49.051207", - "interaction_count": 5, + "curiosity": 1.0, + "last_updated": "2025-12-15T05:38:06.084867", + "interaction_count": 14, "learning_queue": [], "active_goals": [], "preferences": { diff --git a/cortex/router.py b/cortex/router.py index 75d514d..8bbbc74 100644 --- a/cortex/router.py +++ b/cortex/router.py @@ -301,10 +301,9 @@ async def run_reason(req: ReasonRequest): if proactive_enabled: try: from autonomy.proactive.monitor import get_proactive_monitor - from autonomy.self.state import load_self_state monitor = get_proactive_monitor(min_priority=proactive_min_priority) - self_state = load_self_state() + self_state = load_self_state() # Already imported at top of file suggestion = await monitor.analyze_session( session_id=req.session_id, diff --git a/neomem/neomem/vector_stores/qdrant.py b/neomem/neomem/vector_stores/qdrant.py index 59ee9a9..456da2e 100644 --- a/neomem/neomem/vector_stores/qdrant.py +++ b/neomem/neomem/vector_stores/qdrant.py @@ -1,7 +1,9 @@ import logging import os import shutil +from typing import Optional +from pydantic import BaseModel from qdrant_client import QdrantClient from qdrant_client.models import ( Distance, @@ -19,6 +21,13 @@ from mem0.vector_stores.base import VectorStoreBase logger = logging.getLogger(__name__) +class OutputData(BaseModel): + """Standard output format for vector search results.""" + id: Optional[str] + score: Optional[float] + payload: Optional[dict] + + class Qdrant(VectorStoreBase): def __init__( self, @@ -170,7 +179,7 @@ class Qdrant(VectorStoreBase): filters (dict, optional): Filters to apply to the search. Defaults to None. Returns: - list: Search results. + list: Search results wrapped in OutputData format. """ query_filter = self._create_filter(filters) if filters else None hits = self.client.query_points( @@ -179,7 +188,16 @@ class Qdrant(VectorStoreBase): query_filter=query_filter, limit=limit, ) - return hits.points + + # Wrap results in OutputData format to match other vector stores + return [ + OutputData( + id=str(hit.id), + score=hit.score, + payload=hit.payload + ) + for hit in hits.points + ] def delete(self, vector_id: int): """ @@ -207,7 +225,7 @@ class Qdrant(VectorStoreBase): point = PointStruct(id=vector_id, vector=vector, payload=payload) self.client.upsert(collection_name=self.collection_name, points=[point]) - def get(self, vector_id: int) -> dict: + def get(self, vector_id: int) -> OutputData: """ Retrieve a vector by ID. @@ -215,10 +233,17 @@ class Qdrant(VectorStoreBase): vector_id (int): ID of the vector to retrieve. Returns: - dict: Retrieved vector. + OutputData: Retrieved vector wrapped in OutputData format. """ result = self.client.retrieve(collection_name=self.collection_name, ids=[vector_id], with_payload=True) - return result[0] if result else None + if result: + hit = result[0] + return OutputData( + id=str(hit.id), + score=None, # No score for direct retrieval + payload=hit.payload + ) + return None def list_cols(self) -> list: """ @@ -251,7 +276,7 @@ class Qdrant(VectorStoreBase): limit (int, optional): Number of vectors to return. Defaults to 100. Returns: - list: List of vectors. + list: List of vectors wrapped in OutputData format. """ query_filter = self._create_filter(filters) if filters else None result = self.client.scroll( @@ -261,7 +286,18 @@ class Qdrant(VectorStoreBase): with_payload=True, with_vectors=False, ) - return result + + # Wrap results in OutputData format + # scroll() returns tuple: (points, next_page_offset) + points = result[0] if isinstance(result, tuple) else result + return [ + OutputData( + id=str(point.id), + score=None, # No score for list operation + payload=point.payload + ) + for point in points + ] def reset(self): """Reset the index by deleting and recreating it."""