diff --git a/python/semantic_kernel/memory/volatile_memory_store.py b/python/semantic_kernel/memory/volatile_memory_store.py index 7a57862f1edd..d06de5434d33 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 index 3b3f6323ff22..ae38d00ac1b6 100644 --- a/python/tests/unit/memory/test_volatile_memory_store.py +++ b/python/tests/unit/memory/test_volatile_memory_store.py @@ -1,11 +1,59 @@ # 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, + ) + + async def test_get_nearest_matches_empty_collection(): store = VolatileMemoryStore() await store.create_collection("test")