diff --git a/python/semantic_kernel/memory/volatile_memory_store.py b/python/semantic_kernel/memory/volatile_memory_store.py index dd1a631d0614..83d2daa3cde2 100644 --- a/python/semantic_kernel/memory/volatile_memory_store.py +++ b/python/semantic_kernel/memory/volatile_memory_store.py @@ -213,13 +213,16 @@ 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, ) + if len(results) == 0: + raise ServiceResourceNotFoundError("No match found") + 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..dcd0638a30e6 --- /dev/null +++ b/python/tests/unit/memory/test_volatile_memory_store.py @@ -0,0 +1,55 @@ +# Copyright (c) Microsoft. All rights reserved. + +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 + + +@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 + + +@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, + )