← back to invincible-jha__agent-memory

Function bodies 288 total

All specs Real LLM only Function bodies
ProvenanceDisplay.summary method · python · L15-L29 (15 LOC)
src/agent_memory/provenance/display.py
    def summary(self, entry: MemoryEntry) -> str:
        """Return a single-line provenance summary string."""
        tier = self._tracker.get_tier(entry)
        rel = self._tracker.get_reliability(entry)
        tagged_at = entry.metadata.get("provenance_tagged_at", "unknown")
        note = entry.metadata.get("provenance_note", "")
        parts = [
            f"source={entry.source.value}",
            f"tier={tier}",
            f"reliability={rel:.2f}",
            f"tagged_at={tagged_at}",
        ]
        if note:
            parts.append(f"note={note!r}")
        return " | ".join(parts)
ProvenanceDisplay.as_dict method · python · L31-L40 (10 LOC)
src/agent_memory/provenance/display.py
    def as_dict(self, entry: MemoryEntry) -> dict[str, str | float]:
        """Return provenance data as a structured dictionary."""
        return {
            "memory_id": entry.memory_id,
            "source": entry.source.value,
            "tier": self._tracker.get_tier(entry),
            "reliability": self._tracker.get_reliability(entry),
            "tagged_at": entry.metadata.get("provenance_tagged_at", ""),
            "note": entry.metadata.get("provenance_note", ""),
        }
SourceReliability.tier_label method · python · L38-L49 (12 LOC)
src/agent_memory/provenance/reliability.py
    def tier_label(self, source: MemorySource) -> str:
        """Return a human-readable reliability tier label."""
        score = self.score(source)
        if score >= 0.90:
            return "VERIFIED_TOOL"
        if score >= 0.80:
            return "VERIFIED_DOCUMENT"
        if score >= 0.65:
            return "USER_INPUT"
        if score >= 0.45:
            return "AGENT_INFERENCE"
        return "UNKNOWN"
ProvenanceTracker.tag method · python · L26-L41 (16 LOC)
src/agent_memory/provenance/tracker.py
    def tag(
        self,
        entry: MemoryEntry,
        note: str = "",
    ) -> MemoryEntry:
        """Return a new entry with provenance metadata applied from its source."""
        rel_score = self._reliability.score(entry.source)
        tier = self._reliability.tier_label(entry.source)
        now_iso = datetime.now(timezone.utc).isoformat()
        updated_meta = dict(entry.metadata)
        updated_meta[self._RELIABILITY_KEY] = str(round(rel_score, 4))
        updated_meta[self._TIER_KEY] = tier
        updated_meta[self._TAGGED_AT_KEY] = now_iso
        if note:
            updated_meta[self._SOURCE_NOTE_KEY] = note
        return entry.model_copy(update={"metadata": updated_meta})
ProvenanceTracker.get_reliability method · python · L43-L51 (9 LOC)
src/agent_memory/provenance/tracker.py
    def get_reliability(self, entry: MemoryEntry) -> float:
        """Return the stored reliability score, or re-compute from source."""
        raw = entry.metadata.get(self._RELIABILITY_KEY)
        if raw is not None:
            try:
                return float(raw)
            except ValueError:
                pass
        return self._reliability.score(entry.source)
ProvenanceTracker.override_reliability method · python · L61-L68 (8 LOC)
src/agent_memory/provenance/tracker.py
    def override_reliability(
        self,
        entry: MemoryEntry,
        new_source: MemorySource,
    ) -> MemoryEntry:
        """Re-tag an entry with a different source, updating all provenance fields."""
        updated = entry.model_copy(update={"source": new_source})
        return self.tag(updated)
FusionWeights.__post_init__ method · python · L73-L82 (10 LOC)
src/agent_memory/retrieval/fusion.py
    def __post_init__(self) -> None:
        total = self.vector + self.graph + self.recency
        if abs(total - 1.0) > 0.01:
            raise ValueError(
                f"FusionWeights must sum to 1.0, got {total:.4f} "
                f"(vector={self.vector}, graph={self.graph}, recency={self.recency})"
            )
        for name, value in (("vector", self.vector), ("graph", self.graph), ("recency", self.recency)):
            if value < 0.0:
                raise ValueError(f"Weight '{name}' must be >= 0.0, got {value}")
Repobility · open methodology · https://repobility.com/research/
ScoreFusion.fuse method · python · L121-L196 (76 LOC)
src/agent_memory/retrieval/fusion.py
    def fuse(
        self,
        vector_results: list[RetrievalResult],
        graph_results: list[RetrievalResult],
        recency_results: list[RetrievalResult],
        top_k: int = 10,
    ) -> list[RetrievalResult]:
        """Fuse results from all three backends into a single ranked list.

        Parameters
        ----------
        vector_results:
            Results from the vector store (source tag ``"vector"``).
        graph_results:
            Results from the graph retriever (source tag ``"graph"``).
        recency_results:
            Results from the recency scorer (source tag ``"recency"``).
        top_k:
            Maximum number of fused results to return.

        Returns
        -------
        list[RetrievalResult]
            Merged results with ``source="hybrid"`` sorted by fused score
            descending, up to *top_k* items.
        """
        if top_k <= 0:
            return []

        # Index each result list by content string
        vector_
GraphRetriever.__init__ method · python · L89-L96 (8 LOC)
src/agent_memory/retrieval/graph_retriever.py
    def __init__(self, hop_decay: float = 0.8) -> None:
        if not (0.0 < hop_decay <= 1.0):
            raise ValueError(f"hop_decay must be in (0, 1], got {hop_decay}")
        self._hop_decay = hop_decay
        # Adjacency list: node_label -> list of (relation, target_label, weight)
        self._graph: dict[str, list[tuple[str, str, float]]] = {}
        # Reverse adjacency for undirected search (also traverse incoming edges)
        self._reverse_graph: dict[str, list[tuple[str, str, float]]] = {}
GraphRetriever.add_edge method · python · L102-L142 (41 LOC)
src/agent_memory/retrieval/graph_retriever.py
    def add_edge(
        self,
        source: str,
        relation: str,
        target: str,
        weight: float = 1.0,
    ) -> None:
        """Add a directed, weighted edge to the knowledge graph.

        Parameters
        ----------
        source:
            Label of the source node.
        relation:
            Relation type string (e.g. ``"capital_of"``, ``"knows"``).
        target:
            Label of the target node.
        weight:
            Edge weight in ``(0.0, 1.0]``.  Higher weight means greater
            relevance of this edge.

        Raises
        ------
        ValueError
            If *weight* is not in ``(0.0, 1.0]``.
        """
        if not (0.0 < weight <= 1.0):
            raise ValueError(f"weight must be in (0, 1], got {weight}")

        if source not in self._graph:
            self._graph[source] = []
        self._graph[source].append((relation, target, weight))

        # Ensure target node exists in the graph even if it has no outgo
GraphRetriever.retrieve method · python · L156-L261 (106 LOC)
src/agent_memory/retrieval/graph_retriever.py
    def retrieve(
        self,
        query: str,
        max_hops: int = 2,
        top_k: int = 5,
        bidirectional: bool = True,
    ) -> list[RetrievalResult]:
        """Retrieve nodes reachable from seed nodes matching *query*.

        Seed selection: any node whose label shares at least one token
        with the query (case-insensitive).

        BFS traversal up to *max_hops* hops collects candidates.  Each
        candidate is scored as ``seed_weight × hop_decay^hop_distance``
        where ``seed_weight`` is the maximum edge weight on any path from
        the seed to the candidate.

        Parameters
        ----------
        query:
            Free-text query used to identify seed nodes.
        max_hops:
            Maximum number of hops from a seed node.
        top_k:
            Maximum number of results to return.
        bidirectional:
            When ``True`` also traverse reverse edges so that nodes
            mentioning any query token as a *target* c
HybridRetriever.__init__ method · python · L90-L100 (11 LOC)
src/agent_memory/retrieval/hybrid.py
    def __init__(
        self,
        vector_store: VectorStoreProtocol | None = None,
        graph: GraphRetriever | None = None,
        recency: RecencyScorer | None = None,
        fusion: ScoreFusion | None = None,
    ) -> None:
        self._vector_store = vector_store
        self._graph = graph if graph is not None else GraphRetriever()
        self._recency = recency if recency is not None else RecencyScorer()
        self._fusion = fusion if fusion is not None else ScoreFusion()
HybridRetriever.retrieve method · python · L106-L149 (44 LOC)
src/agent_memory/retrieval/hybrid.py
    def retrieve(self, query: str, top_k: int = 10) -> list[RetrievalResult]:
        """Retrieve the most relevant results for *query* across all signals.

        Parameters
        ----------
        query:
            Free-text query string.
        top_k:
            Maximum number of results to return.

        Returns
        -------
        list[RetrievalResult]
            Results ranked by fused score, highest first.
        """
        vector_results: list[RetrievalResult] = []
        graph_results: list[RetrievalResult] = []
        recency_results: list[RetrievalResult] = []

        # --- Vector signal ---
        if self._vector_store is not None:
            try:
                vector_results = self._vector_store.query(query, top_k=top_k)
            except Exception:
                vector_results = []

        # --- Graph signal ---
        try:
            graph_results = self._graph.retrieve(query, top_k=top_k)
        except Exception:
            graph_results =
HybridRetriever._recency_from_existing method · python · L155-L207 (53 LOC)
src/agent_memory/retrieval/hybrid.py
    def _recency_from_existing(
        self,
        existing: list[RetrievalResult],
        top_k: int,
    ) -> list[RetrievalResult]:
        """Produce recency-scored versions of already-retrieved results.

        Extracts ``"timestamp"`` from each result's metadata (if present)
        and scores it with the recency scorer.  Results without a timestamp
        receive a score of 0.0.

        Parameters
        ----------
        existing:
            Results from vector and graph retrievers.
        top_k:
            Maximum results to return.

        Returns
        -------
        list[RetrievalResult]
        """
        from datetime import datetime, timezone

        scored: list[RetrievalResult] = []
        for result in existing:
            ts_raw = result.metadata.get("timestamp")
            if isinstance(ts_raw, datetime):
                timestamp = ts_raw
            elif isinstance(ts_raw, str):
                try:
                    timestamp = datetime.fro
ResultRanker.score method · python · L72-L98 (27 LOC)
src/agent_memory/retrieval/ranking.py
    def score(self, entry: MemoryEntry, query: str) -> float:
        """Compute a combined relevance score in [0, 1].

        Parameters
        ----------
        entry:
            The memory entry to score.
        query:
            The original search query.

        Returns
        -------
        float
            Weighted score in [0.0, 1.0].
        """
        weights = self._weights
        total_weight = weights.total
        if total_weight == 0.0:
            return 0.0

        text_score = self._text_relevance(entry.content, query) * weights.text_relevance
        importance_score = entry.importance_score * weights.importance
        freshness_score = entry.freshness_score * weights.freshness
        provenance_score = self._provenance_score(entry) * weights.provenance

        raw = (text_score + importance_score + freshness_score + provenance_score) / total_weight
        return round(min(1.0, max(0.0, raw)), 6)
Source: Repobility analyzer · https://repobility.com
ResultRanker.rank method · python · L100-L119 (20 LOC)
src/agent_memory/retrieval/ranking.py
    def rank(
        self,
        entries: list[tuple[MemoryEntry, str]],
    ) -> list[tuple[float, MemoryEntry]]:
        """Rank a list of (entry, query) pairs.

        Parameters
        ----------
        entries:
            Each element is ``(entry, query)`` where query is the original
            search string used to retrieve this entry.

        Returns
        -------
        list[tuple[float, MemoryEntry]]
            ``(score, entry)`` pairs sorted by score descending.
        """
        scored = [(self.score(entry, query), entry) for entry, query in entries]
        scored.sort(key=lambda x: x[0], reverse=True)
        return scored
ResultRanker._text_relevance method · python · L125-L142 (18 LOC)
src/agent_memory/retrieval/ranking.py
    def _text_relevance(self, content: str, query: str) -> float:
        """TF-style overlap score between query tokens and content."""
        query_tokens = _tokenise(query)
        if not query_tokens:
            return 0.0
        content_tokens = _tokenise(content)
        if not content_tokens:
            return 0.0

        total_tf = 0.0
        for token in query_tokens:
            tf = content_tokens.count(token) / len(content_tokens)
            total_tf += tf

        # Average TF across query tokens, then apply a scaling function
        avg_tf = total_tf / len(query_tokens)
        # Sigmoid-style saturation: map small TF values to meaningful scores
        return round(_sigmoid_scale(avg_tf), 6)
ResultRanker._provenance_score method · python · L144-L153 (10 LOC)
src/agent_memory/retrieval/ranking.py
    def _provenance_score(self, entry: MemoryEntry) -> float:
        """Extract provenance reliability from metadata, or estimate from source."""
        raw = entry.metadata.get("provenance_reliability")
        if raw is not None:
            try:
                return float(raw)
            except ValueError:
                pass
        # Fallback: heuristic from source type
        return _SOURCE_PROVENANCE.get(entry.source.value, 0.5)
_sigmoid_scale function · python · L173-L178 (6 LOC)
src/agent_memory/retrieval/ranking.py
def _sigmoid_scale(value: float, steepness: float = 10.0) -> float:
    """Map a small float [0, 1] to a sharper [0, 1] via a sigmoid."""
    if value <= 0.0:
        return 0.0
    # Standard sigmoid shifted so that value=0.5 maps near 0.99
    return 1.0 / (1.0 + math.exp(-steepness * (value - 0.5)))
RecencyScorer.__init__ method · python · L55-L60 (6 LOC)
src/agent_memory/retrieval/recency_scorer.py
    def __init__(self, half_life_hours: float = 168.0) -> None:
        if half_life_hours <= 0.0:
            raise ValueError(
                f"half_life_hours must be positive, got {half_life_hours}"
            )
        self._half_life_hours = half_life_hours
RecencyScorer.score method · python · L67-L98 (32 LOC)
src/agent_memory/retrieval/recency_scorer.py
    def score(
        self,
        timestamp: datetime,
        reference: datetime | None = None,
    ) -> float:
        """Compute the recency score for a timestamp.

        Parameters
        ----------
        timestamp:
            When the item was created or last updated.
        reference:
            The reference point for age computation.  Defaults to the
            current UTC time when ``None``.

        Returns
        -------
        float
            Score in ``[0.0, 1.0]``.  Items in the future receive 1.0.
        """
        ref = reference if reference is not None else datetime.now(timezone.utc)
        ts_utc = _to_utc(timestamp)
        ref_utc = _to_utc(ref)

        age_seconds = (ref_utc - ts_utc).total_seconds()
        if age_seconds <= 0.0:
            # Future or same-time item — maximum freshness
            return 1.0

        age_hours = age_seconds / 3600.0
        raw = math.pow(2.0, -age_hours / self._half_life_hours)
        return round(min(1.0
RecencyScorer.rank method · python · L100-L133 (34 LOC)
src/agent_memory/retrieval/recency_scorer.py
    def rank(
        self,
        items: list[tuple[str, datetime]],
        reference: datetime | None = None,
    ) -> list[RetrievalResult]:
        """Score and rank a list of ``(content, timestamp)`` pairs.

        Parameters
        ----------
        items:
            Each element is ``(content, timestamp)`` where ``content``
            is the text of the memory item and ``timestamp`` is when it
            was created.
        reference:
            Reference time for age computation.  Defaults to now.

        Returns
        -------
        list[RetrievalResult]
            Results sorted by recency score descending.  Each entry has
            ``source="recency"``.
        """
        ref = reference if reference is not None else datetime.now(timezone.utc)
        results: list[RetrievalResult] = [
            RetrievalResult(
                content=content,
                source="recency",
                score=self.score(ts, reference=ref),
                metadata=
MemorySearchEngine.__init__ method · python · L53-L61 (9 LOC)
src/agent_memory/retrieval/search.py
    def __init__(
        self,
        stores: Optional[dict[MemoryLayer, MemoryStore]] = None,
        ranker: Optional[object] = None,
        default_limit: int = 20,
    ) -> None:
        self._stores: dict[MemoryLayer, MemoryStore] = stores or {}
        self._ranker = ranker
        self._default_limit = default_limit
Citation: Repobility (2026). State of AI-Generated Code. https://repobility.com/research/
MemorySearchEngine.search method · python · L67-L124 (58 LOC)
src/agent_memory/retrieval/search.py
    def search(
        self,
        query: str,
        layer: Optional[MemoryLayer] = None,
        limit: Optional[int] = None,
        min_importance: float = 0.0,
        min_freshness: float = 0.0,
    ) -> list[SearchResult]:
        """Search for entries matching the query.

        Parameters
        ----------
        query:
            The free-text search query.
        layer:
            If provided, only the store for that layer is searched.
        limit:
            Maximum results to return; falls back to ``default_limit``.
        min_importance:
            Exclude entries with ``importance_score`` below this value.
        min_freshness:
            Exclude entries with ``freshness_score`` below this value.

        Returns
        -------
        list[SearchResult]
            Results sorted by score descending.
        """
        effective_limit = limit if limit is not None else self._default_limit
        raw_entries: dict[str, tuple[MemoryEntry, MemoryLayer]] 
MemorySearchEngine.search_all method · python · L126-L132 (7 LOC)
src/agent_memory/retrieval/search.py
    def search_all(
        self,
        query: str,
        limit: Optional[int] = None,
    ) -> list[SearchResult]:
        """Convenience method: search all layers without filters."""
        return self.search(query, layer=None, limit=limit)
MemorySearchEngine.get_by_layer method · python · L134-L143 (10 LOC)
src/agent_memory/retrieval/search.py
    def get_by_layer(
        self,
        layer: MemoryLayer,
        limit: int = 100,
    ) -> list[MemoryEntry]:
        """Return all entries from a given layer, up to ``limit``."""
        store = self._stores.get(layer)
        if store is None:
            return []
        return list(store.all(layer=layer))[:limit]
MemorySearchEngine._rank_results method · python · L149-L170 (22 LOC)
src/agent_memory/retrieval/search.py
    def _rank_results(
        self,
        entries: list[tuple[MemoryEntry, MemoryLayer]],
        query: str,
    ) -> list[SearchResult]:
        """Score and wrap entries as SearchResult objects."""
        from agent_memory.retrieval.ranking import ResultRanker

        ranker: ResultRanker = self._ranker or ResultRanker()  # type: ignore[assignment]
        results: list[SearchResult] = []
        for rank_idx, (entry, matched_layer) in enumerate(entries):
            score = ranker.score(entry, query)
            results.append(
                SearchResult(
                    entry=entry,
                    score=score,
                    rank=rank_idx + 1,
                    matched_layer=matched_layer,
                    query=query,
                )
            )
        return results
AgentMemoryHandler.do_GET method · python · L44-L74 (31 LOC)
src/agent_memory/server/app.py
    def do_GET(self) -> None:
        """Handle all GET requests by routing on the URL path."""
        parsed = urllib.parse.urlparse(self.path)
        path = parsed.path.rstrip("/")
        query_params = urllib.parse.parse_qs(parsed.query)

        if path == "/health":
            status, data = routes.handle_health()
            self._send_json(status, data)

        elif path == "/search":
            query = self._first_param(query_params, "q") or ""
            layer = self._first_param(query_params, "layer")
            limit_str = self._first_param(query_params, "limit")
            limit = int(limit_str) if limit_str and limit_str.isdigit() else 20
            status, data = routes.handle_search_memories(
                query=query, layer=layer, limit=limit
            )
            self._send_json(status, data)

        else:
            match = _MEMORY_ID_PATTERN.match(path)
            if match:
                memory_id = match.group(1)
                status, data = r
AgentMemoryHandler.do_POST method · python · L78-L93 (16 LOC)
src/agent_memory/server/app.py
    def do_POST(self) -> None:
        """Handle all POST requests by routing on the URL path."""
        parsed = urllib.parse.urlparse(self.path)
        path = parsed.path.rstrip("/")

        body = self._read_json_body()
        if body is None:
            return

        if path == "/memories":
            status, data = routes.handle_create_memory(body)
            self._send_json(status, data)
        else:
            self._send_json(
                404, {"error": "Not found", "detail": f"No route for POST {path}"}
            )
AgentMemoryHandler.do_DELETE method · python · L97-L111 (15 LOC)
src/agent_memory/server/app.py
    def do_DELETE(self) -> None:
        """Handle all DELETE requests by routing on the URL path."""
        parsed = urllib.parse.urlparse(self.path)
        path = parsed.path.rstrip("/")

        match = _MEMORY_ID_PATTERN.match(path)
        if match:
            memory_id = match.group(1)
            status, data = routes.handle_delete_memory(memory_id)
            self._send_json(status, data)
        else:
            self._send_json(
                404,
                {"error": "Not found", "detail": f"No route for DELETE {path}"},
            )
AgentMemoryHandler._send_json method · python · L115-L122 (8 LOC)
src/agent_memory/server/app.py
    def _send_json(self, status: int, data: dict[str, object]) -> None:
        """Serialize *data* to JSON and send an HTTP response with *status*."""
        body = json.dumps(data, default=str).encode("utf-8")
        self.send_response(status)
        self.send_header("Content-Type", "application/json; charset=utf-8")
        self.send_header("Content-Length", str(len(body)))
        self.end_headers()
        self.wfile.write(body)
Repobility · code-quality intelligence platform · https://repobility.com
AgentMemoryHandler._read_json_body method · python · L124-L139 (16 LOC)
src/agent_memory/server/app.py
    def _read_json_body(self) -> dict[str, object] | None:
        """Read and parse the JSON request body.

        Returns None (and sends a 400 error response) if parsing fails.
        """
        content_length = int(self.headers.get("Content-Length", 0))
        if content_length == 0:
            return {}

        raw = self.rfile.read(content_length)
        try:
            parsed: dict[str, object] = json.loads(raw.decode("utf-8"))
            return parsed
        except (json.JSONDecodeError, UnicodeDecodeError) as exc:
            self._send_json(400, {"error": "Invalid JSON", "detail": str(exc)})
            return None
AgentMemoryHandler._first_param method · python · L142-L147 (6 LOC)
src/agent_memory/server/app.py
    def _first_param(
        params: dict[str, list[str]], key: str
    ) -> str | None:
        """Return the first value for *key* from query parameters, or None."""
        values = params.get(key)
        return values[0] if values else None
create_server function · python · L150-L167 (18 LOC)
src/agent_memory/server/app.py
def create_server(host: str = "0.0.0.0", port: int = 8080) -> HTTPServer:
    """Create (but do not start) the agent-memory HTTP server.

    Parameters
    ----------
    host:
        Bind address (default ``"0.0.0.0"`` — all interfaces).
    port:
        TCP port to listen on (default 8080).

    Returns
    -------
    HTTPServer
        A configured server instance ready to call ``serve_forever()`` on.
    """
    server = HTTPServer((host, port), AgentMemoryHandler)
    logger.info("agent-memory server created at http://%s:%d", host, port)
    return server
run_server function · python · L170-L187 (18 LOC)
src/agent_memory/server/app.py
def run_server(host: str = "0.0.0.0", port: int = 8080) -> None:
    """Create and run the agent-memory HTTP server (blocking).

    Parameters
    ----------
    host:
        Bind address.
    port:
        TCP port.
    """
    server = create_server(host=host, port=port)
    logger.info("Serving agent-memory on http://%s:%d — press Ctrl-C to stop", host, port)
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        logger.info("Shutting down agent-memory server.")
    finally:
        server.server_close()
_build_arg_parser function · python · L190-L203 (14 LOC)
src/agent_memory/server/app.py
def _build_arg_parser() -> argparse.ArgumentParser:
    parser = argparse.ArgumentParser(
        description="agent-memory HTTP server",
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
    )
    parser.add_argument("--host", default="0.0.0.0", help="Bind address")
    parser.add_argument("--port", type=int, default=8080, help="TCP port")
    parser.add_argument(
        "--log-level",
        default="INFO",
        choices=["DEBUG", "INFO", "WARNING", "ERROR"],
        help="Logging level",
    )
    return parser
_entry_to_response function · python · L31-L47 (17 LOC)
src/agent_memory/server/routes.py
def _entry_to_response(entry: MemoryEntry) -> MemoryResponse:
    """Convert a MemoryEntry to a MemoryResponse."""
    return MemoryResponse(
        memory_id=entry.memory_id,
        content=entry.content,
        layer=entry.layer.value,
        importance_score=entry.importance_score,
        freshness_score=entry.freshness_score,
        source=entry.source.value,
        safety_critical=entry.safety_critical,
        composite_score=entry.composite_score,
        importance_level=entry.importance_level.value,
        created_at=entry.created_at.isoformat(),
        last_accessed=entry.last_accessed.isoformat(),
        access_count=entry.access_count,
        metadata=entry.metadata,
    )
handle_create_memory function · python · L50-L92 (43 LOC)
src/agent_memory/server/routes.py
def handle_create_memory(body: dict[str, object]) -> tuple[int, dict[str, object]]:
    """Handle POST /memories.

    Parameters
    ----------
    body:
        Parsed JSON request body.

    Returns
    -------
    tuple[int, dict[str, object]]
        HTTP status code and response dictionary.
    """
    try:
        request = CreateMemoryRequest.model_validate(body)
    except Exception as exc:
        return 422, ErrorResponse(error="Validation error", detail=str(exc)).model_dump()

    try:
        layer = MemoryLayer(request.layer)
    except ValueError:
        return 422, ErrorResponse(
            error="Invalid layer",
            detail=f"Layer {request.layer!r} is not valid. "
            f"Choose from: {[l.value for l in MemoryLayer]}",
        ).model_dump()

    try:
        source = MemorySource(request.source)
    except ValueError:
        source = MemorySource.AGENT_INFERENCE

    entry = MemoryEntry(
        content=request.content,
        layer=layer,
        im
handle_search_memories function · python · L95-L137 (43 LOC)
src/agent_memory/server/routes.py
def handle_search_memories(
    query: str,
    layer: str | None = None,
    limit: int = 20,
) -> tuple[int, dict[str, object]]:
    """Handle GET /search?q=...

    Performs case-insensitive substring matching against memory content.

    Parameters
    ----------
    query:
        Search term.
    layer:
        Optional layer filter.
    limit:
        Maximum results to return.

    Returns
    -------
    tuple[int, dict[str, object]]
        HTTP status code and response dictionary.
    """
    query_lower = query.lower()
    results: list[MemoryEntry] = []

    for entry in _memory_store.values():
        if query_lower and query_lower not in entry.content.lower():
            continue
        if layer and entry.layer.value != layer:
            continue
        results.append(entry)

    # Sort by composite_score descending
    results.sort(key=lambda e: e.composite_score, reverse=True)
    results = results[:limit]

    response = SearchResponse(
        query=query,
      
Repobility · open methodology · https://repobility.com/research/
handle_delete_memory function · python · L140-L161 (22 LOC)
src/agent_memory/server/routes.py
def handle_delete_memory(memory_id: str) -> tuple[int, dict[str, object]]:
    """Handle DELETE /memories/{id}.

    Parameters
    ----------
    memory_id:
        The memory identifier from the URL path.

    Returns
    -------
    tuple[int, dict[str, object]]
        HTTP status code and response dictionary.
    """
    if memory_id not in _memory_store:
        return 404, ErrorResponse(
            error="Not found",
            detail=f"Memory {memory_id!r} not found.",
        ).model_dump()

    del _memory_store[memory_id]
    response = DeleteMemoryResponse(memory_id=memory_id, deleted=True)
    return 200, response.model_dump()
handle_get_memory function · python · L164-L188 (25 LOC)
src/agent_memory/server/routes.py
def handle_get_memory(memory_id: str) -> tuple[int, dict[str, object]]:
    """Handle GET /memories/{id}.

    Parameters
    ----------
    memory_id:
        The memory identifier.

    Returns
    -------
    tuple[int, dict[str, object]]
        HTTP status code and response dictionary.
    """
    entry = _memory_store.get(memory_id)
    if entry is None:
        return 404, ErrorResponse(
            error="Not found",
            detail=f"Memory {memory_id!r} not found.",
        ).model_dump()

    # Touch access count
    entry = entry.touch()
    _memory_store[memory_id] = entry

    return 200, _entry_to_response(entry).model_dump()
handle_health function · python · L191-L200 (10 LOC)
src/agent_memory/server/routes.py
def handle_health() -> tuple[int, dict[str, object]]:
    """Handle GET /health.

    Returns
    -------
    tuple[int, dict[str, object]]
        HTTP status code and response dictionary.
    """
    response = HealthResponse(memory_count=len(_memory_store))
    return 200, response.model_dump()
StorageBackend.save method · python · L28-L35 (8 LOC)
src/agent_memory/storage/base.py
    def save(self, entry: MemoryEntry) -> None:
        """Persist a memory entry, replacing any existing entry with the same key.

        Parameters
        ----------
        entry:
            The entry to persist. ``entry.memory_id`` is used as the key.
        """
StorageBackend.load method · python · L38-L50 (13 LOC)
src/agent_memory/storage/base.py
    def load(self, key: str) -> Optional[MemoryEntry]:
        """Load an entry by its key.

        Parameters
        ----------
        key:
            The ``memory_id`` of the entry to load.

        Returns
        -------
        MemoryEntry | None
            The entry, or None if no entry with that key exists.
        """
StorageBackend.delete method · python · L53-L65 (13 LOC)
src/agent_memory/storage/base.py
    def delete(self, key: str) -> bool:
        """Remove an entry by key.

        Parameters
        ----------
        key:
            The ``memory_id`` to remove.

        Returns
        -------
        bool
            True if the entry existed and was deleted, False otherwise.
        """
StorageBackend.search method · python · L68-L89 (22 LOC)
src/agent_memory/storage/base.py
    def search(
        self,
        query: str,
        layer: Optional[MemoryLayer] = None,
        limit: int = 20,
    ) -> Sequence[MemoryEntry]:
        """Search stored entries by content.

        Parameters
        ----------
        query:
            The search query string.
        layer:
            Optional layer filter.
        limit:
            Maximum number of results to return.

        Returns
        -------
        Sequence[MemoryEntry]
            Matching entries, ordered by relevance (implementation-defined).
        """
StorageBackend.list_keys method · python · L92-L112 (21 LOC)
src/agent_memory/storage/base.py
    def list_keys(
        self,
        layer: Optional[MemoryLayer] = None,
        limit: int = 1000,
    ) -> list[str]:
        """List stored entry keys.

        Parameters
        ----------
        layer:
            Optional layer filter. If provided, only keys for that layer
            are returned.
        limit:
            Maximum number of keys to return.

        Returns
        -------
        list[str]
            Entry keys (``memory_id`` values), in an implementation-defined
            order.
        """
Source: Repobility analyzer · https://repobility.com
StorageBackend.clear method · python · L115-L128 (14 LOC)
src/agent_memory/storage/base.py
    def clear(self, layer: Optional[MemoryLayer] = None) -> int:
        """Remove all stored entries, optionally filtered by layer.

        Parameters
        ----------
        layer:
            If provided, only entries in this layer are removed.
            If None, all entries are removed.

        Returns
        -------
        int
            Number of entries deleted.
        """
StorageBackend.count method · python · L134-L140 (7 LOC)
src/agent_memory/storage/base.py
    def count(self, layer: Optional[MemoryLayer] = None) -> int:
        """Return the number of stored entries.

        The default implementation uses ``list_keys``; backends with
        native count operations should override this for efficiency.
        """
        return len(self.list_keys(layer=layer))
StorageBackend.load_all method · python · L142-L170 (29 LOC)
src/agent_memory/storage/base.py
    def load_all(
        self,
        layer: Optional[MemoryLayer] = None,
        limit: int = 1000,
    ) -> list[MemoryEntry]:
        """Load multiple entries at once.

        The default implementation calls ``load`` for each key from
        ``list_keys``. Backends may override this for batch efficiency.

        Parameters
        ----------
        layer:
            Optional layer filter.
        limit:
            Maximum number of entries to return.

        Returns
        -------
        list[MemoryEntry]
            Loaded entries (None results are omitted).
        """
        keys = self.list_keys(layer=layer, limit=limit)
        results: list[MemoryEntry] = []
        for key in keys:
            entry = self.load(key)
            if entry is not None:
                results.append(entry)
        return results
‹ prevpage 5 / 6next ›