From 3cb68034dca8a76d8c168ca769c72f4df2ac90c4 Mon Sep 17 00:00:00 2001 From: Francisco Javier Arceo Date: Mon, 3 Feb 2025 13:32:06 -0500 Subject: [PATCH 1/2] feat: Adding retrieve_online_documents endpoint Signed-off-by: Francisco Javier Arceo --- .../feature-servers/python-feature-server.md | 15 ++++---- sdk/python/feast/feature_server.py | 35 +++++++++++++++++++ 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/docs/reference/feature-servers/python-feature-server.md b/docs/reference/feature-servers/python-feature-server.md index d7374852495..348bfdcd3d8 100644 --- a/docs/reference/feature-servers/python-feature-server.md +++ b/docs/reference/feature-servers/python-feature-server.md @@ -226,13 +226,14 @@ feast serve --key /path/to/key.pem --cert /path/to/cert.pem ## API Endpoints and Permissions -| Endpoint | Resource Type | Permission | Description | -| ---------------------------- |---------------------------------|-------------------------------------------------------| ------------------------------------------------------------------------ | -| /get-online-features | FeatureView,OnDemandFeatureView | Read Online | Get online features from the feature store | -| /push | FeatureView | Write Online, Write Offline, Write Online and Offline | Push features to the feature store (online, offline, or both) | -| /write-to-online-store | FeatureView | Write Online | Write features to the online store | -| /materialize | FeatureView | Write Online | Materialize features within a specified time range | -| /materialize-incremental | FeatureView | Write Online | Incrementally materialize features up to a specified timestamp | +| Endpoint | Resource Type | Permission | Description | +|----------------------------|---------------------------------|-------------------------------------------------------|----------------------------------------------------------------| +| /get-online-features | FeatureView,OnDemandFeatureView | Read Online | Get online features from the feature store | +| /retrieve-online-documents | FeatureView | Read Online | Retrieve online documents from the feature store for RAG | +| /push | FeatureView | Write Online, Write Offline, Write Online and Offline | Push features to the feature store (online, offline, or both) | +| /write-to-online-store | FeatureView | Write Online | Write features to the online store | +| /materialize | FeatureView | Write Online | Materialize features within a specified time range | +| /materialize-incremental | FeatureView | Write Online | Incrementally materialize features up to a specified timestamp | ## How to configure Authentication and Authorization ? diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index e22ff43b9c2..20b0e3e44da 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -75,6 +75,12 @@ class GetOnlineFeaturesRequest(BaseModel): features: Optional[List[str]] = None full_feature_names: bool = False +class RetrieveOnlineDocumentsRequest(BaseModel): + entities: Dict[str, List[Any]] + feature_service: Optional[str] = None + features: Optional[List[str]] = None + full_feature_names: bool = False + query_embedding: Optional[List[float]] = None def _get_features(request: GetOnlineFeaturesRequest, store: "feast.FeatureStore"): if request.feature_service: @@ -177,6 +183,35 @@ async def get_online_features(request: GetOnlineFeaturesRequest) -> Dict[str, An ) return response_dict + @app.post( + "/retrieve-online-documents", + dependencies=[Depends(inject_user_details)], + ) + async def retrieve_online_documents(request: RetrieveOnlineDocumentsRequest) -> Dict[str, Any]: + logger.warn("This endpoint is in alpha and will be moved to /get-online-features when stable.") + # Initialize parameters for FeatureStore.retrieve_online_documents_v2(...) call + features = await run_in_threadpool(_get_features, request, store) + + read_params = dict( + features=features, + entity_rows=request.entities, + full_feature_names=request.full_feature_names, + query=request.query_embedding, + ) + + response = await run_in_threadpool( + lambda: store.retrieve_online_documents_v2(**read_params) # type: ignore + ) + + # Convert the Protobuf object to JSON and return it + response_dict = await run_in_threadpool( + MessageToDict, + response.proto, + preserving_proto_field_name=True, + float_precision=18, + ) + return response_dict + @app.post("/push", dependencies=[Depends(inject_user_details)]) async def push(request: PushFeaturesRequest) -> None: df = pd.DataFrame(request.df) From 889362bad41adcbe9e6ad445f161875caf200cd1 Mon Sep 17 00:00:00 2001 From: Francisco Javier Arceo Date: Mon, 3 Feb 2025 14:11:52 -0500 Subject: [PATCH 2/2] updated feature server Signed-off-by: Francisco Javier Arceo --- sdk/python/feast/feature_server.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index 20b0e3e44da..ed742bcb98f 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -74,14 +74,9 @@ class GetOnlineFeaturesRequest(BaseModel): feature_service: Optional[str] = None features: Optional[List[str]] = None full_feature_names: bool = False - -class RetrieveOnlineDocumentsRequest(BaseModel): - entities: Dict[str, List[Any]] - feature_service: Optional[str] = None - features: Optional[List[str]] = None - full_feature_names: bool = False query_embedding: Optional[List[float]] = None + def _get_features(request: GetOnlineFeaturesRequest, store: "feast.FeatureStore"): if request.feature_service: feature_service = store.get_feature_service( @@ -110,7 +105,6 @@ def _get_features(request: GetOnlineFeaturesRequest, store: "feast.FeatureStore" resource=od_feature_view, actions=[AuthzedAction.READ_ONLINE] ) features = request.features # type: ignore - return features @@ -187,8 +181,12 @@ async def get_online_features(request: GetOnlineFeaturesRequest) -> Dict[str, An "/retrieve-online-documents", dependencies=[Depends(inject_user_details)], ) - async def retrieve_online_documents(request: RetrieveOnlineDocumentsRequest) -> Dict[str, Any]: - logger.warn("This endpoint is in alpha and will be moved to /get-online-features when stable.") + async def retrieve_online_documents( + request: GetOnlineFeaturesRequest, + ) -> Dict[str, Any]: + logger.warn( + "This endpoint is in alpha and will be moved to /get-online-features when stable." + ) # Initialize parameters for FeatureStore.retrieve_online_documents_v2(...) call features = await run_in_threadpool(_get_features, request, store)