From 100183d983d5e674c15611d0d140f1f1c5a8e020 Mon Sep 17 00:00:00 2001 From: emme1t <149944796+emme1t@users.noreply.github.com> Date: Sat, 19 Sep 2026 04:26:43 -0700 Subject: [PATCH] Python: Copy only the requested in-memory search page --- .../core/agent_framework/_in_memory.py | 4 ++-- .../core/tests/core/test_in_memory.py | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/python/packages/core/agent_framework/_in_memory.py b/python/packages/core/agent_framework/_in_memory.py index 3ca22163a58..01b5ef6d448 100644 --- a/python/packages/core/agent_framework/_in_memory.py +++ b/python/packages/core/agent_framework/_in_memory.py @@ -389,14 +389,14 @@ async def _inner_search( ) from exc if score_threshold is not None and not comparison(score, score_threshold): continue - results.append({"record": deepcopy(record), "score": score}) + results.append({"record": record, "score": score}) results.sort( key=lambda result: cast(float, result["score"]), reverse=distance_function in _DESCENDING_DISTANCE_FUNCTIONS, ) total_count = len(results) return SearchResults( - results[skip : skip + top], + deepcopy(results[skip : skip + top]), metadata={"in_memory_total_count": total_count}, ) diff --git a/python/packages/core/tests/core/test_in_memory.py b/python/packages/core/tests/core/test_in_memory.py index ca72fdcef61..6477548c689 100644 --- a/python/packages/core/tests/core/test_in_memory.py +++ b/python/packages/core/tests/core/test_in_memory.py @@ -167,6 +167,30 @@ async def test_in_memory_get_filters_before_ordering_and_paging() -> None: assert results == [Document("one", "Luxury hotel", "travel", 5, ["wifi", "pool"], "featured")] +@pytest.mark.parametrize("include_vectors", [False, True]) +async def test_in_memory_search_page_is_detached_from_stored_records(include_vectors: bool) -> None: + collection = await _create_collection() + results = await collection.search(vector=[1.0, 0.0], skip=1, top=1, include_vectors=include_vectors) + + assert results.metadata == {"in_memory_total_count": 2} + rows = [result async for result in results] + assert len(rows) == 1 + record = rows[0]["record"] + assert record.id == "two" + assert rows[0]["score"] == 0.0 + record.tags.append("changed") + if include_vectors: + assert record.vector is not None + assert record.vector == [0.0, 1.0] + record.vector[0] = 99.0 + else: + assert record.vector is None + + assert await collection.get(["two"], include_vectors=True) == [DOCUMENTS[1]] + next_results = await collection.search(vector=[1.0, 0.0], skip=1, top=1, include_vectors=True) + assert [result["record"] async for result in next_results] == [DOCUMENTS[1]] + + async def test_in_memory_generates_missing_string_keys() -> None: definition = VectorStoreCollectionDefinition( [