diff --git a/redisvl/extensions/router/semantic.py b/redisvl/extensions/router/semantic.py index c6d33656..ea9bbb6f 100644 --- a/redisvl/extensions/router/semantic.py +++ b/redisvl/extensions/router/semantic.py @@ -577,8 +577,11 @@ def remove_route(self, route_name: str) -> None: self._update_router_state() def delete(self) -> None: - """Delete the semantic router index.""" + """Delete the semantic router index and its persisted route config.""" self._index.delete(drop=True) + # The route config is stored as a standalone JSON key that is not + # tracked by the search index, so it must be removed explicitly. + self._index.client.delete(f"{self.name}:route_config") # type: ignore def clear(self) -> None: """Flush all routes from the semantic router index.""" diff --git a/tests/integration/test_semantic_router.py b/tests/integration/test_semantic_router.py index 872cb531..97b6bbfa 100644 --- a/tests/integration/test_semantic_router.py +++ b/tests/integration/test_semantic_router.py @@ -685,6 +685,34 @@ def test_from_existing(client, redis_url, routes, redis_test_name): router.delete() +def test_delete_removes_route_config_key( + client, routes, hf_vectorizer, redis_test_name +): + """delete() must remove the persisted {name}:route_config key (issue #634).""" + skip_if_no_redis_search(client) + + router = SemanticRouter( + name=redis_test_name("test_router_delete"), + routes=routes, + routing_config=RoutingConfig(max_k=2), + redis_client=client, + overwrite=True, + vectorizer=hf_vectorizer, + ) + config_key = f"{router.name}:route_config" + + # The config key is written when the router is constructed. + assert client.exists(config_key) + + router.delete() + + # delete() must drop the index AND remove the standalone config key, so a + # subsequent from_existing() finds no stale config to load. + assert not client.exists(config_key) + with pytest.raises(ValueError): + SemanticRouter.from_existing(name=router.name, redis_client=client) + + def test_get_route_references(semantic_router): # Get references for a specific route refs = semantic_router.get_route_references(route_name="greeting")