You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
POST /get-online-features (and /search / /retrieve-online-documents with api_version: 2) accepts include_feature_view_version_metadata: true. With that flag set, the response metadata should contain feature_view_metadata, a list of {name, version} entries, like the Python SDK and gRPC paths return. Three things support this:
ServingService.proto: repeated FeatureViewMetadata feature_view_metadata = 2; // Only populated when requested.
The feast/feature_server_utils.py docstring says convert_response_to_dict matches MessageToDict(proto, preserving_proto_field_name=True). The only exception it documents is double_val precision. MessageToDict does emit feature_view_metadata.
RemoteOnlineStore sends the flag to the server, and its unit test says it does so "so versioned reads work end-to-end".
Current Behavior
The flag reaches store.get_online_features(...), and metadata.feature_view_metadata is filled on the response proto. It is then dropped during JSON serialization. The HTTP response metadata only ever contains feature_names, so over REST the flag has no effect.
The field is lost in three places:
feature_server_utils._metadata_to_dict only reads metadata.feature_names.
RemoteOnlineStore._build_online_response_from_json (infra/online_stores/remote.py) rebuilds the metadata from feature_names only. Even if the server returned the field, a client using a remote online store would still lose it.
End to end, with feast serve on any repo. The PR's test_get_online_features_returns_feature_view_version_metadata checks the same thing through the FastAPI test client:
Expected Behavior
POST /get-online-features(and/search//retrieve-online-documentswithapi_version: 2) acceptsinclude_feature_view_version_metadata: true. With that flag set, the responsemetadatashould containfeature_view_metadata, a list of{name, version}entries, like the Python SDK and gRPC paths return. Three things support this:ServingService.proto:repeated FeatureViewMetadata feature_view_metadata = 2; // Only populated when requested.feast/feature_server_utils.pydocstring saysconvert_response_to_dictmatchesMessageToDict(proto, preserving_proto_field_name=True). The only exception it documents isdouble_valprecision.MessageToDictdoes emitfeature_view_metadata.RemoteOnlineStoresends the flag to the server, and its unit test says it does so "so versioned reads work end-to-end".Current Behavior
The flag reaches
store.get_online_features(...), andmetadata.feature_view_metadatais filled on the response proto. It is then dropped during JSON serialization. The HTTP response metadata only ever containsfeature_names, so over REST the flag has no effect.The field is lost in three places:
feature_server_utils._metadata_to_dictonly readsmetadata.feature_names.OnlineFeaturesMetadataResponseinfeature_server.pyhas nofeature_view_metadatafield. Before perf: Replace MessageToDict with optimized custom dict builder #6015, the endpoint returned a dict throughresponse_model=OnlineFeaturesResponse, so this model already filtered the field out. In practice the field has not been returned over REST since the flag was added in feat: Add version tracking to FeatureView #6101.RemoteOnlineStore._build_online_response_from_json(infra/online_stores/remote.py) rebuilds the metadata fromfeature_namesonly. Even if the server returned the field, a client using a remote online store would still lose it.Steps to reproduce
Minimal, no server needed (master @ 810391f):
End to end, with
feast serveon any repo. The PR'stest_get_online_features_returns_feature_view_version_metadatachecks the same thing through the FastAPI test client:Specifications
Possible Solution
_metadata_to_dict, emitfeature_view_metadatawhen it is non-empty, in the same shapeMessageToDictuses (default-valuedname/versionare omitted).feature_view_metadata: List[FeatureViewMetadataResponse]toOnlineFeaturesMetadataResponseso the OpenAPI schema documents it.RemoteOnlineStore._build_online_response_from_json, parse the field back into the proto.I have a small PR with regression tests ready and will link it here.
AI assistance: drafted with an AI coding assistant (Claude). The reproduction above was run locally against the current default branch.