From 9abdccfe41c2f7cd44338b8f7b926c069802d342 Mon Sep 17 00:00:00 2001 From: minelhi <3417378192@qq.com> Date: Sun, 11 Oct 2026 22:35:40 +0800 Subject: [PATCH 1/2] fix(memory): await get_nearest_matches in VolatileMemoryStore.get_nearest_match Return the top (record, score) tuple instead of an un-awaited coroutine (#14521). Co-authored-by: Cursor --- .../memory/volatile_memory_store.py | 3 +- .../unit/memory/test_volatile_memory_store.py | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 python/tests/unit/memory/test_volatile_memory_store.py diff --git a/python/semantic_kernel/memory/volatile_memory_store.py b/python/semantic_kernel/memory/volatile_memory_store.py index dd1a631d0614..da7ededf5dfb 100644 --- a/python/semantic_kernel/memory/volatile_memory_store.py +++ b/python/semantic_kernel/memory/volatile_memory_store.py @@ -213,13 +213,14 @@ async def get_nearest_match( Returns: Tuple[MemoryRecord, float]: The record and the relevance score. """ - return self.get_nearest_matches( + results = await self.get_nearest_matches( collection_name=collection_name, embedding=embedding, limit=1, min_relevance_score=min_relevance_score, with_embeddings=with_embedding, ) + return results[0] async def get_nearest_matches( self, diff --git a/python/tests/unit/memory/test_volatile_memory_store.py b/python/tests/unit/memory/test_volatile_memory_store.py new file mode 100644 index 000000000000..406c925410f7 --- /dev/null +++ b/python/tests/unit/memory/test_volatile_memory_store.py @@ -0,0 +1,30 @@ +# Copyright (c) Microsoft. All rights reserved. + +import numpy as np +import pytest + +from semantic_kernel.memory.memory_record import MemoryRecord +from semantic_kernel.memory.volatile_memory_store import VolatileMemoryStore + + +@pytest.mark.asyncio +async def test_get_nearest_match_awaits_and_returns_tuple() -> None: + """get_nearest_match must await get_nearest_matches (issue #14521).""" + store = VolatileMemoryStore() + await store.create_collection("c") + await store.upsert( + "c", + MemoryRecord.local_record( + "id1", + "text", + "desc", + None, + np.array([1.0, 0.0], dtype=float), + ), + ) + match = await store.get_nearest_match("c", np.array([1.0, 0.0], dtype=float)) + assert isinstance(match, tuple) + assert len(match) == 2 + record, score = match + assert record.id == "id1" + assert score >= 0.0 From dbac7a683177cd5d2541b2daa5f6987a23ca7746 Mon Sep 17 00:00:00 2001 From: minelhi <3417378192@qq.com> Date: Tue, 13 Oct 2026 19:10:30 +0800 Subject: [PATCH 2/2] fix(memory): raise ServiceResourceNotFoundError when get_nearest_match finds nothing Match PostgresMemoryStore empty-result behavior and cover it with a unit test. Co-authored-by: Cursor --- .../memory/volatile_memory_store.py | 2 ++ .../unit/memory/test_volatile_memory_store.py | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/python/semantic_kernel/memory/volatile_memory_store.py b/python/semantic_kernel/memory/volatile_memory_store.py index da7ededf5dfb..83d2daa3cde2 100644 --- a/python/semantic_kernel/memory/volatile_memory_store.py +++ b/python/semantic_kernel/memory/volatile_memory_store.py @@ -220,6 +220,8 @@ async def get_nearest_match( min_relevance_score=min_relevance_score, with_embeddings=with_embedding, ) + if len(results) == 0: + raise ServiceResourceNotFoundError("No match found") return results[0] async def get_nearest_matches( diff --git a/python/tests/unit/memory/test_volatile_memory_store.py b/python/tests/unit/memory/test_volatile_memory_store.py index 406c925410f7..dcd0638a30e6 100644 --- a/python/tests/unit/memory/test_volatile_memory_store.py +++ b/python/tests/unit/memory/test_volatile_memory_store.py @@ -3,6 +3,9 @@ import numpy as np import pytest +from pytest import raises + +from semantic_kernel.exceptions import ServiceResourceNotFoundError from semantic_kernel.memory.memory_record import MemoryRecord from semantic_kernel.memory.volatile_memory_store import VolatileMemoryStore @@ -28,3 +31,25 @@ async def test_get_nearest_match_awaits_and_returns_tuple() -> None: record, score = match assert record.id == "id1" assert score >= 0.0 + + +@pytest.mark.asyncio +async def test_get_nearest_match_raises_when_no_match() -> None: + store = VolatileMemoryStore() + await store.create_collection("c") + await store.upsert( + "c", + MemoryRecord.local_record( + "id1", + "text", + "desc", + None, + np.array([1.0, 0.0], dtype=float), + ), + ) + with raises(ServiceResourceNotFoundError, match="No match found"): + await store.get_nearest_match( + "c", + np.array([1.0, 0.0], dtype=float), + min_relevance_score=1.1, + )