GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — feat: Feast-MLflow Integration by Vperiodt · Pull Request #6235 · feast-dev/feast

Conversation

@Vperiodt

@Vperiodt Vperiodt commented Apr 8, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

What this PR does / why we need it:

final_mlflow_demo.mp4

Native MLflow integration for Feast that provides automatic feature lineage tracking alongside ML experiments. When enabled via feature_store.yaml, every feature retrieval is logged to the active MLflow run.

Key Capabilities

  1. Auto-logging: Feature retrieval metadata is tagged on the active MLflow run (feast.feature_refs, feast.feature_views, feast.feature_service, feast.entity_count, etc.)
  2. Entity DataFrame archival: Optionally saves the training entity DataFrame as an MLflow artifact (entity_df.parquet) for full reproducibility
  3. Model-to-feature-service resolution: store.mlflow.resolve_features() maps any MLflow model URI back to its Feast feature service, enabling serving pipelines to auto-discover which features a model needs
  4. Entity DataFrame reconstruction: store.mlflow.get_training_entity_df() rebuilds the exact entity DataFrame from a past run's artifacts, enabling training reproducibility
  5. Model lifecycle lineage: log_model auto-attaches feast_features.json, register_model propagates feast.feature_service to model versions, load_model links prediction runs to training runs
  6. Operations audit trail: feast apply and feast materialize logged to a dedicated {project}-feast-ops experiment
  7. Dataset tracking: log_training_dataset() logs training DataFrames as MLflow dataset inputs
  8. Two access patterns: store.mlflow (explicit, multi-store safe) and feast.mlflow (drop-in replacement for import mlflow)
  9. Configuration: Controlled entirely via feature_store.yaml under a new mlflow: block

Demo

Full end-to-end demo notebook with all capabilities: integration-example

Which issue(s) this PR fixes:

Checks

  • I've made sure the tests are passing.
  • My commits are signed off (git commit -s)
  • My PR title follows conventional commits format

Testing Strategy

  • Unit tests
  • Integration tests
  • Manual tests
  • Testing is not required for this change

Misc


Open with Devin

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

ntkathole, franciscojavierarceo, jyejare, and distinguished-sre reacted with rocket emoji
All reactions
  • 🚀 4 reactions
github-advanced-security[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Vperiodt
Vperiodt force-pushed the feast-mlflow branch from 0e6296b to a63d529 Compare April 9, 2026 12:05
@Vperiodt
Vperiodt marked this pull request as ready for review April 9, 2026 12:06
@Vperiodt
Vperiodt requested a review from a team as a code owner April 9, 2026 12:06
devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Vperiodt
Vperiodt force-pushed the feast-mlflow branch from 2f79660 to 4aa9d50 Compare April 14, 2026 08:16
devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Vperiodt
Vperiodt force-pushed the feast-mlflow branch from 7ceaa94 to 08a8f91 Compare April 14, 2026 14:08
devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Vperiodt Vperiodt changed the title Feast-MLflow Integration feat: Feast-MLflow Integration Apr 15, 2026
devin-ai-integration[bot]
devin-ai-integration Bot reviewed Apr 15, 2026
View reviewed changes

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

View 19 additional findings in Devin Review.

Open in Devin Review

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread sdk/python/feast/feature_store.py Outdated
with tempfile.TemporaryDirectory() as tmp_dir:
path = os.path.join(tmp_dir, "entity_df.parquet")
entity_df.to_parquet(path, index=False)
mlflow.log_artifact(path)

@devin-ai-integration devin-ai-integration Bot Apr 15, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Mixing global mlflow.log_artifact() with explicit-URI client causes artifact/metadata to target different servers

In _auto_log_entity_df_info, tags and params are logged via a locally-created MlflowClient(tracking_uri=tracking_uri) (lines 304, 309-318), but the entity DataFrame artifact is uploaded via the global mlflow.log_artifact(path) (line 327). The global function uses the tracking URI set by mlflow.set_tracking_uri(), not the explicit tracking_uri from the config. If the global tracking URI is changed by another library in the process, or if _init_mlflow_tracking failed silently (caught by except Exception at sdk/python/feast/feature_store.py:249), the artifact would be uploaded to a different server than where the tags/params were logged, splitting metadata across two servers.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@Vperiodt
Vperiodt force-pushed the feast-mlflow branch from 6683cb5 to dba7e99 Compare April 16, 2026 12:48
devin-ai-integration[bot]
devin-ai-integration Bot reviewed Apr 16, 2026
View reviewed changes

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 2 new potential issues.

View 20 additional findings in Devin Review.

Open in Devin Review

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread sdk/python/feast/ui_server.py Outdated
try:
import mlflow

tracking_uri = mlflow_cfg.tracking_uri or "http://127.0.0.1:5000"

@devin-ai-integration devin-ai-integration Bot Apr 16, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 UI server ignores MLFLOW_TRACKING_URI env var, falls back to hardcoded localhost

In ui_server.py, both the /api/mlflow-runs and /api/mlflow-feature-models endpoints resolve the MLflow tracking URI using mlflow_cfg.tracking_uri or "http://127.0.0.1:5000". This reads the raw tracking_uri field from the config and falls back to a hardcoded localhost URL, completely bypassing the MLFLOW_TRACKING_URI environment variable. In contrast, the rest of the codebase (feature_store.py:243, feature_store.py:325, feature_store.py:1696, feature_store.py:2885) correctly calls mlflow_cfg.get_tracking_uri() which checks the env var via sdk/python/feast/mlflow_integration/config.py:19-29. When a user sets MLFLOW_TRACKING_URI without setting tracking_uri in YAML (which is a very common deployment pattern, and documented in the PR's own docs at docs/reference/mlflow.md:51), the UI endpoints will incorrectly connect to http://127.0.0.1:5000 instead of the env-var-specified server.

Suggested change
tracking_uri = mlflow_cfg.tracking_uri or "http://127.0.0.1:5000"
tracking_uri = mlflow_cfg.get_tracking_uri() or "http://127.0.0.1:5000"
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread sdk/python/feast/ui_server.py Outdated
try:
import mlflow

tracking_uri = mlflow_cfg.tracking_uri or "http://127.0.0.1:5000"

@devin-ai-integration devin-ai-integration Bot Apr 16, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Second UI endpoint also ignores MLFLOW_TRACKING_URI env var

Same issue as in the /api/mlflow-runs endpoint: the /api/mlflow-feature-models endpoint at sdk/python/feast/ui_server.py:234 uses mlflow_cfg.tracking_uri or "http://127.0.0.1:5000" instead of mlflow_cfg.get_tracking_uri(), causing the MLFLOW_TRACKING_URI environment variable to be ignored.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@Vperiodt
Vperiodt force-pushed the feast-mlflow branch from e933f27 to 76c4363 Compare April 20, 2026 09:25
devin-ai-integration[bot]
devin-ai-integration Bot reviewed Apr 20, 2026
View reviewed changes

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 3 new potential issues.

View 22 additional findings in Devin Review.

Open in Devin Review

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread sdk/python/feast/feature_store.py Outdated
)

# Emit MLflow event for materialization (Phase 7)
_mat_duration = time.monotonic() - _retrieval_start if '_retrieval_start' in dir() else 0

@devin-ai-integration devin-ai-integration Bot Apr 20, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Undefined _retrieval_start variable in materialize_incremental causes bogus duration or NameError

In materialize_incremental, the code at line 2115 references _retrieval_start which is never defined in that method scope. The expression '_retrieval_start' in dir() checks local variable names but dir() without arguments returns module-level names, not local variables -- so the check is unreliable. If _retrieval_start is not in the returned list, _mat_duration defaults to 0 (acceptable but meaningless). However, if it IS in the name list (e.g., a module-level _retrieval_start existed from another context), it would attempt time.monotonic() - _retrieval_start on a potentially unrelated value, resulting in a wrong duration or a NameError/TypeError at runtime.

Suggested change
_mat_duration = time.monotonic() - _retrieval_start if '_retrieval_start' in dir() else 0
_mat_duration = 0
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread sdk/python/feast/mlflow_integration/logger.py Outdated
Comment on lines +185 to +189
if tracking_uri:
mlflow.set_tracking_uri(tracking_uri)

experiment_name = f"{project}{ops_experiment_suffix}"
mlflow.set_experiment(experiment_name)

@devin-ai-integration devin-ai-integration Bot Apr 20, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 log_apply_to_mlflow and log_materialize_to_mlflow mutate global MLflow tracking URI and experiment, corrupting concurrent user runs

Both log_apply_to_mlflow (sdk/python/feast/mlflow_integration/logger.py:185-189) and log_materialize_to_mlflow (sdk/python/feast/mlflow_integration/logger.py:251-255) call mlflow.set_tracking_uri(tracking_uri) and mlflow.set_experiment(experiment_name) globally. These mutate process-wide global state. If a user has an active MLflow run in a different experiment (e.g. during feast apply inside a training script), these calls redirect subsequent MLflow operations to the ops experiment. While the functions try to restore mlflow.set_experiment(project) afterward (line 224, 274), the tracking URI is never restored. In the exception path, if mlflow.start_run() raises (line 202/258), the experiment remains set to the ops experiment. This corrupts any concurrent or subsequent user operations in the same process.

Prompt for agents
The functions log_apply_to_mlflow and log_materialize_to_mlflow in sdk/python/feast/mlflow_integration/logger.py mutate process-wide global state by calling mlflow.set_tracking_uri() and mlflow.set_experiment(). This corrupts any concurrent user MLflow runs in the same process.

The fix should save and restore the original tracking URI and experiment before/after the ops logging, or preferably use the MlflowClient API exclusively (which already takes tracking_uri as a parameter) instead of the global mlflow module-level functions. The MlflowClient.create_run() method allows creating runs in specific experiments without mutating global state. This pattern is already used in log_feature_retrieval_to_mlflow which correctly uses client = mlflow.MlflowClient(tracking_uri=tracking_uri) without touching global state.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread sdk/python/feast/repo_config.py
Comment on lines +497 to +506
def mlflow(self):
"""Get the MLflow configuration."""
if not self._mlflow:
if isinstance(self.mlflow_config, Dict):
from feast.mlflow_integration.config import MlflowConfig

self._mlflow = MlflowConfig(**self.mlflow_config)
elif self.mlflow_config:
self._mlflow = self.mlflow_config
return self._mlflow

@devin-ai-integration devin-ai-integration Bot Apr 20, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 mlflow property returns falsy None on subsequent calls when MlflowConfig(enabled=False) is set

The mlflow property in RepoConfig (sdk/python/feast/repo_config.py:497-506) uses if not self._mlflow: as the guard. When the config is a valid MlflowConfig object with enabled=False, self._mlflow will be a truthy MlflowConfig instance (Pydantic models are truthy), so this works correctly on first access. However, if mlflow_config is None (the default), self._mlflow stays None forever and the property returns None -- which is fine. The real issue is: if mlflow_config is an empty dict {}, MlflowConfig(**{}) creates a valid config with enabled=False, and self._mlflow becomes truthy. But if mlflow_config is set to some falsy-like Pydantic object (unlikely but possible with custom subclasses), the if not self._mlflow guard would re-create it every time. This is the same pattern as openlineage property so it's consistent, but not actually a bug for standard usage.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
franciscojavierarceo
franciscojavierarceo reviewed Apr 20, 2026
View reviewed changes
Comment thread docs/reference/mlflow.md Outdated
- **Online feature retrieval** -- `get_online_features()` tags the run with the same metadata
- **Entity DataFrame archival** -- optionally saves the training entity DataFrame as an MLflow artifact for full reproducibility
- **Execution context tagging** -- tags runs with where they ran (workbench, KFP pipeline, feature server, or standalone)
- **Operation logging** -- optionally logs `feast apply` and `feast materialize` to a separate MLflow experiment

@franciscojavierarceo franciscojavierarceo Apr 20, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure this is actually useful

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@Vperiodt Vperiodt Apr 20, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

actually, this is not updated one, thought of this one for backtracking from mllfow run to the workbench experiment but now it is omitted

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
franciscojavierarceo
franciscojavierarceo reviewed Apr 20, 2026
View reviewed changes
Comment thread docs/reference/mlflow.md Outdated
- **Entity DataFrame archival** -- optionally saves the training entity DataFrame as an MLflow artifact for full reproducibility
- **Execution context tagging** -- tags runs with where they ran (workbench, KFP pipeline, feature server, or standalone)
- **Operation logging** -- optionally logs `feast apply` and `feast materialize` to a separate MLflow experiment
- **Model-to-Feature resolution** -- map any MLflow model URI back to its Feast feature service

@franciscojavierarceo franciscojavierarceo Apr 20, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
franciscojavierarceo
franciscojavierarceo reviewed Apr 20, 2026
View reviewed changes
Comment thread docs/reference/mlflow.md Outdated
- **Execution context tagging** -- tags runs with where they ran (workbench, KFP pipeline, feature server, or standalone)
- **Operation logging** -- optionally logs `feast apply` and `feast materialize` to a separate MLflow experiment
- **Model-to-Feature resolution** -- map any MLflow model URI back to its Feast feature service
- **Training reproducibility** -- reconstruct the exact entity DataFrame from a past MLflow run

@franciscojavierarceo franciscojavierarceo Apr 20, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👏

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
franciscojavierarceo
franciscojavierarceo reviewed Apr 20, 2026
View reviewed changes
Comment thread docs/reference/mlflow.md Outdated
- **Operation logging** -- optionally logs `feast apply` and `feast materialize` to a separate MLflow experiment
- **Model-to-Feature resolution** -- map any MLflow model URI back to its Feast feature service
- **Training reproducibility** -- reconstruct the exact entity DataFrame from a past MLflow run
- **Training-to-prediction linkage** -- `FeastMlflowClient.load_model()` links prediction runs back to their training runs

@franciscojavierarceo franciscojavierarceo Apr 20, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

very nice

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with hooray emoji
All reactions
  • 🎉 1 reaction
franciscojavierarceo
franciscojavierarceo reviewed Apr 20, 2026
View reviewed changes
Comment thread docs/reference/mlflow.md Outdated
- **Model-to-Feature resolution** -- map any MLflow model URI back to its Feast feature service
- **Training reproducibility** -- reconstruct the exact entity DataFrame from a past MLflow run
- **Training-to-prediction linkage** -- `FeastMlflowClient.load_model()` links prediction runs back to their training runs
- **Feast MLflow Client** -- a thin wrapper that eliminates direct `import mlflow` in user code

@franciscojavierarceo franciscojavierarceo Apr 20, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

makes sense

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
franciscojavierarceo
franciscojavierarceo reviewed Apr 20, 2026
View reviewed changes
Comment thread sdk/python/feast/mlflow_integration/logger.py Outdated
_consecutive_failures = 0


def log_feature_retrieval_to_mlflow(

@franciscojavierarceo franciscojavierarceo Apr 20, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i guess if we have this enabled why do we need to even have the wrapper? can't we full handle this for the user?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@franciscojavierarceo franciscojavierarceo Apr 20, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess my question is, can't we just hide all of the mlflow client usage to the user?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@Vperiodt Vperiodt Apr 20, 2026

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the auto-logging in logger.py fully handled for users who already use mlflow.start_run() or client.start_run() considering our FeastMlflowClient wrapper which is for users who want to avoid import mlflow entirely and get additional Feast-specific behavior on top ex: logging a model, registering it, loading it for inference etc soFeastMlflowClient is for users who want the extra lineage features without touching MLflow directly

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@jyejare jyejare Apr 22, 2026

Copy link
Copy Markdown
Collaborator

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would rather push all these functions to integration client as everything here is a part of mlflow feast integration?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Vperiodt
Vperiodt force-pushed the feast-mlflow branch from 58086d5 to 2a5cac7 Compare April 22, 2026 08:48
devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

jyejare
jyejare reviewed Apr 22, 2026
View reviewed changes

@jyejare jyejare left a comment

Copy link
Copy Markdown
Collaborator

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comments inline:

  1. We also need to enable mlflow configuratins from feast operator else admin has to do it explicitly.
  2. Also, we need to remove duplicate mechanisms for initiating/using mlflow client and we should provide a clean way that is store.mlflow whenever possible.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread docs/reference/mlflow.md Outdated
2. `MLFLOW_TRACKING_URI` environment variable
3. MLflow's default (`./mlruns` local directory)

This means you can omit `tracking_uri` from the YAML and set `MLFLOW_TRACKING_URI` in your environment instead.

@jyejare jyejare Apr 22, 2026

Copy link
Copy Markdown
Collaborator

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This means you can omit `tracking_uri` from the YAML and set `MLFLOW_TRACKING_URI` in your environment instead.
This means you can omit `tracking_uri` from the YAML and set `MLFLOW_TRACKING_URI` in your environment instead or it would be pulled from /.mlruns automatically when both are not set.

wdyt ?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
Comment thread docs/reference/mlflow.md Outdated

| Artifact | Description |
|----------|-------------|
| `required_features.json` | JSON list of feature references the model was trained on |

@jyejare jyejare Apr 22, 2026

Copy link
Copy Markdown
Collaborator

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we rename to relate it with feast better and so that it would be self describing in MLFLow ecosystem, something like:

required_feast_features.json

OR

feast_features.json

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
Comment thread docs/reference/mlflow.md Outdated
With the configuration above, feature metadata is logged whenever there is an active MLflow run:

```python
import mlflow

@jyejare jyejare Apr 22, 2026

Copy link
Copy Markdown
Collaborator

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think explicit import is no more required as feast module gives you the ability to:

store.mlflow.start_run(....

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
Comment thread docs/reference/mlflow.md Outdated
from feast import FeatureStore

store = FeatureStore(".")
client = store.get_mlflow_client()

@jyejare jyejare Apr 22, 2026

Copy link
Copy Markdown
Collaborator

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Even this is changed now. Lets keep only store.mlflow. examples.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread docs/reference/mlflow.md Outdated
| Condition | Error |
|-----------|-------|
| No `feature_store.yaml` in cwd and no store created | `RuntimeError` with guidance to call `feast.mlflow.init(store)` |
| `mlflow.enabled` is `false` or missing | `RuntimeError` with guidance to set `mlflow.enabled=true` |

@jyejare jyejare Apr 22, 2026

Copy link
Copy Markdown
Collaborator

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Even if user wants to set it to false ?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread sdk/python/feast/mlflow_integration/model_resolver.py Outdated
invalid, resolution fails, or validation against the store fails.
"""
try:
import mlflow

@jyejare jyejare Apr 22, 2026

Copy link
Copy Markdown
Collaborator

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here. Create a class and initiate in integration object/class that takes store object as param.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
Comment thread sdk/python/feast/feature_store.py Outdated
if mlflow_cfg is None or not mlflow_cfg.enabled:
return

import mlflow

@jyejare jyejare Apr 22, 2026

Copy link
Copy Markdown
Collaborator

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The store object is available to you here as self, so why not :

self.mlflow.set_tracking_uri(....

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
Comment thread sdk/python/feast/feature_store.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread sdk/python/feast/mlflow.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread sdk/python/tests/integration/test_mlflow_integration.py
client = MlflowClient(tracking_uri=tracking_uri)
refs = ["z_view:f1", "a_view:f2", "z_view:f3", "a_view:f4"]

with mlflow.start_run() as run:

@jyejare jyejare Apr 22, 2026

Copy link
Copy Markdown
Collaborator

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The tests should also be focusing only on store.mlflow... culture.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

devin-ai-integration[bot]

This comment was marked as resolved.

Sign in to view

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

ntkathole
ntkathole requested changes May 12, 2026
View reviewed changes
Comment thread sdk/python/feast/mlflow_integration/logger.py Outdated
ops_suffix = mlflow_cfg.ops_experiment_suffix

effective_uri = self._tracking_uri or self._mlflow.get_tracking_uri()
client = self._mlflow.MlflowClient(tracking_uri=effective_uri)

@ntkathole ntkathole May 12, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

instead of creating new client everytime, can we initialise once and reuse ?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
Comment thread sdk/python/feast/feature_store.py
# Initialize feature service cache for performance optimization
self._feature_service_cache = {}

# Cache for _resolve_feature_service_name lookups

@ntkathole ntkathole May 12, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the MLflow auto-log could resolve to a deleted or renamed feature service. _fs_name_cache and _fs_name_index caches (used by _resolve_feature_service_name) are never cleared when refresh_registry() or _clear_feature_service_cache() is called

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
Comment thread sdk/python/feast/feature_store.py
self._fs_name_cache = {}
self._fs_name_index_ts = time.monotonic()

def _resolve_feature_service_name(self, feature_refs: List[str]) -> Optional[str]:

@ntkathole ntkathole May 12, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't we use existing _feature_service_cache from FeatureStore?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@Vperiodt Vperiodt May 12, 2026

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

_feature_service_cache lookup is : service_name → [feature_refs]and is populated lazily on demand
_fs_name_index lookup is reverse {feature_refs} → service_name, populated from all registry services needed for subset matching when users pass raw refs instead of a FeatureService

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread sdk/python/feast/feature_store.py Outdated

try:
if self.mlflow is not None and self.config.mlflow.auto_log:
import asyncio

@ntkathole ntkathole May 12, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

already imported at top

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
Comment thread sdk/python/feast/feature_store.py Outdated
self._fs_name_index_ts: float = -self._FS_NAME_INDEX_TTL_SECONDS

self._mlflow_client: Optional[Any] = None
self._init_mlflow()

@ntkathole ntkathole May 12, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think better to do lazy loading here, first check the config and then load module.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
Comment thread sdk/python/feast/mlflow_integration/client.py Outdated
self._default_experiment = store.config.project

if self._tracking_uri:
_mlflow_mod.set_tracking_uri(self._tracking_uri)

@ntkathole ntkathole May 12, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove set_tracking_uri() from __init__ and instead pass tracking_uri explicitly when needed (the MlflowClient already receives it)

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
Comment thread sdk/python/feast/ui_server.py
)

@app.get("/api/mlflow-runs")
def get_mlflow_runs(max_results: int = 50):

@ntkathole ntkathole May 12, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should this be a registry API? Not a blocker for this PR, but architecture wise, registry is source of truth

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

@Vperiodt Vperiodt May 12, 2026

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, will add this one will open to other benefits too !

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@ntkathole ntkathole May 15, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Vperiodt going to handle this in this PR or different one?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@Vperiodt Vperiodt May 15, 2026

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yess, will address this in a follow up PR

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@franciscojavierarceo

franciscojavierarceo commented May 13, 2026

Copy link
Copy Markdown
Member

linter is failing

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Vperiodt

Vperiodt commented May 13, 2026

Copy link
Copy Markdown
Contributor Author

linter is failing

fixed

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

ntkathole
ntkathole reviewed May 14, 2026
View reviewed changes
Comment thread pyproject.toml Outdated

@ntkathole ntkathole May 14, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

include mlflow here in ci dependencies

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
ntkathole
ntkathole reviewed May 14, 2026
View reviewed changes
Comment thread ui/src/pages/feature-views/RegularFeatureViewOverviewTab.tsx Outdated
<EuiFlexItem>
<EuiStat title={`${numOfFs}`} description="Consuming Services" />
</EuiFlexItem>
<EuiFlexItem>

@ntkathole ntkathole May 14, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be conditionally rendered, users who don't use MLflow will wonder what these stats mean and why they're there

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
ntkathole
ntkathole reviewed May 14, 2026
View reviewed changes
Comment thread ui/src/pages/feature-views/FeatureViewUsagePanel.tsx
const usage: FeatureUsageEntry | undefined =
data.feature_usage?.[featureViewName];

if (!usage || usage.run_count === 0) {

@ntkathole ntkathole May 14, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here, if mlflow is not configured, this needs to be hidden

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
@ntkathole

ntkathole commented May 14, 2026

Copy link
Copy Markdown
Member

@Vperiodt Guard the UI components behind a check on whether MLflow data is available. The simplest approach is to have the backend return a mlflow_enabled: false flag in the API responses (or a new lightweight /api/mlflow-status endpoint), and conditionally render MLflow components only when enabled.

Vperiodt reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Vperiodt

Vperiodt commented May 14, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor Author

@Vperiodt Guard the UI components behind a check on whether MLflow data is available. The simplest approach is to have the backend return a mlflow_enabled: false flag in the API responses (or a new lightweight /api/mlflow-status endpoint), and conditionally render MLflow components only when enabled.

hello ! @ntkathole, Addressed all reviews

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@ntkathole ntkathole added the ok-to-test label May 15, 2026
@ntkathole

ntkathole commented May 15, 2026

Copy link
Copy Markdown
Member

@Vperiodt need to update pixi.lock file, also please rebase

Vperiodt reacted with thumbs up emoji Vperiodt reacted with eyes emoji
All reactions
  • 👍 1 reaction
  • 👀 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Vperiodt
Vperiodt force-pushed the feast-mlflow branch from fa8fb80 to d798acb Compare May 19, 2026 07:47
Vperiodt added 3 commits May 20, 2026 15:13
@Vperiodt
mlflow-feast integration
b524a9c
Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

refine MLflow integration, UI runs endpoint, and lockfiles

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

fix issues

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

handle fallback

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

added model to features table

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

address CI

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

add docs

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

fix-lint

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

update docs

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

update-logic

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

add-integration-test

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

mlflowclient wrapper

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

address-reviews

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

update docs

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

fix-lint

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

fix-auto-log

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

update feastMlflowClient

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

changing init

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

fixing docs

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

remove doc

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

update format

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

fix-test

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

update docs

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

addressed reviews

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

fix: update .secrets.baseline to remove pragma-allowlisted entry

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

ui-fallback

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED

update requirements

Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED
@Vperiodt
fix-CI
e83d353
Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED
@Vperiodt
fix-lint
3da673d
Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED
@Vperiodt
Vperiodt force-pushed the feast-mlflow branch 2 times, most recently from 92892e7 to 3da673d Compare May 20, 2026 09:46
Vperiodt added 2 commits May 21, 2026 10:53
@Vperiodt
Merge branch 'master' into feast-mlflow
e52ad74
@Vperiodt
fix: remove unused imports in ui_server.py
d740a85
Signed-off-by: Vanshika Vanshika <[email protected]>

rh-pre-commit.version: 2.3.2
rh-pre-commit.check-secrets: ENABLED
ntkathole
ntkathole approved these changes May 21, 2026
View reviewed changes

@ntkathole ntkathole left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me! Thank you @Vperiodt , This is great

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Vperiodt and franciscojavierarceo reacted with heart emoji Vperiodt and franciscojavierarceo reacted with rocket emoji
All reactions
  • ❤️ 2 reactions
  • 🚀 2 reactions
@Vperiodt
Merge branch 'master' into feast-mlflow
ac07fbf
@ntkathole
ntkathole merged commit 7279c75 into feast-dev:master May 21, 2026
26 of 28 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@franciscojavierarceo

franciscojavierarceo commented May 21, 2026

Copy link
Copy Markdown
Member

lgtm

Vperiodt reacted with heart emoji
All reactions
  • ❤️ 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Vperiodt Vperiodt mentioned this pull request Jun 1, 2026
docs: Add blog post for native MLflow integration #6460
Merged
7 tasks
franciscojavierarceo pushed a commit that referenced this pull request Jun 13, 2026
@feast-ci-bot
chore(release): release 0.64.0
9bb73cc
# [0.64.0](v0.63.0...v0.64.0) (2026-06-13)

### Bug Fixes

* Add async_supported property to RedisOnlineStore ([9b088fe](9b088fe))
* Add missing feast init templates to operator CRD and enhance persistence documentation ([1941d4d](1941d4d))
* Allow to publish from reference branch ([5458ec8](5458ec8))
* API calls list ([4203eb7](4203eb7))
* **bigquery:** Enable list inference for parquet loads in offline_write_batch ([9243497](9243497)), closes [#5845](#5845)
* Bump grpcio dependencies ([07b4782](07b4782))
* **compute-engine/local:** Honor field_mapping on join keys in dedup + join nodes ([#6395](#6395)) ([bd01824](bd01824))
* **dynamodb:** Avoid tag race condition by using diff-based tag updates ([#6479](#6479)) ([bad2b7d](bad2b7d)), closes [#6418](#6418)
* **dynamodb:** Fix mypy type for _build_projection_expression return ([217b4da](217b4da))
* Fix intermittent async test failures for DynamoDB and Redis ([63c5eb1](63c5eb1))
* Fix mongodb blog title ([57d28d4](57d28d4))
* Fix shared SQL registry crash - avoid unnecessary UDF deserialization in proto cache building ([ac588d7](ac588d7))
* Fix SparkRetrievalJob.persist() failing for SparkSource ([209d7cd](209d7cd))
* Fixed formatting and image for mongo blog ([#6377](#6377)) ([f8389fb](f8389fb))
* Fixes for ray source ([7f592a4](7f592a4))
* **go:** skip registry refresh when cache_ttl_seconds <= 0 ([97ed40c](97ed40c))
* Handle array of strings columns in Athena materialization ([#6324](#6324)) ([4ed0278](4ed0278))
* make milvus VARCHAR max_length configurable, remove hardcoded 512 limit ([3b98c22](3b98c22))
* **operator:** Set appProtocol: grpc on registry gRPC Service ([#6367](#6367)) ([c9ae2b4](c9ae2b4))
* PyJWT 2.10+ added validation that rejects empty HMAC keys ([e756ffe](e756ffe))
* RemoteOnlineStore sends all features in a single HTTP request ([8f187dd](8f187dd))
* Remove registry proto dump to enforce RBAC and add permission checks to Commit/Refresh RPCs ([328431f](328431f))
* Remove selector migration job - no longer needed ([51c325e](51c325e))
* replace broken .claude skill symlink with correct relative path ([4541690](4541690))
* Replace selector label strip patch with migration Job for upgrade-safe selector uniqueness ([00dea50](00dea50))
* Scope feature view name conflict check to current project in file-based registry ([#6369](#6369)) ([a4fde83](a4fde83)), closes [#6209](#6209)
* **snowflake:** Stop double-quoting connection identifiers ([#6462](#6462)) ([e914d59](e914d59))
* **spark:** S3/GCS PyArrow filesystem resolution for staging paths ([#6442](#6442)) ([ae50414](ae50414))
* **trino:** Clean up temporary entity tables after retrieval ([#6381](#6381)) ([d86b13d](d86b13d)), closes [#6306](#6306)
* Update go-feature-server base image to Go 1.25 and fix operator Dockerfile COPY permissions ([86ef0bc](86ef0bc))

### Features

* [Backend] Data Quality Monitoring with native compute, multi-backend support, REST API, CLI ([#6202](#6202)) ([5458c37](5458c37))
* Add apache flink compute engine ([#6476](#6476)) ([9636d6a](9636d6a))
* Add demo noteboooks for users ([e362173](e362173))
* Add enabled/disabled toggle for feature views ([#6401](#6401)) ([5f1fa0d](5f1fa0d)), closes [#6395](#6395)
* Add Label View to init template ([ec272d5](ec272d5))
* Add mTLS support to remote registry gRPC client ([#6474](#6474)) ([c9602d8](c9602d8))
* Add Prometheus gauges for FeatureStore installation telemetry ([#6354](#6354)) ([1b681b7](1b681b7))
* Adds registry REST API endpoints for managing entities, data sources, and feature views ([#6413](#6413)) ([f77bd1d](f77bd1d))
* Allow CRUD on entities, data sources, and feature views from UI ([#6412](#6412)) ([2321c07](2321c07))
* Allow default openlineage configuration ([#6467](#6467)) ([276b6df](276b6df))
* **bigquery:** Support DATE-type event timestamp columns ([#6362](#6362)) ([753dee5](753dee5)), closes [#2530](#2530)
* **cli:** Add `feast projects delete` command (closes [#5095](#5095)) ([#6318](#6318)) ([1a4b96c](1a4b96c))
* Data Quality Monitoring added in feast UI ([#6422](#6422)) ([fa271be](fa271be))
* **dynamodb:** Use ProjectionExpression when requested_features is set ([0adc906](0adc906)), closes [#6058](#6058)
* Enhance DataSource and FeatureView modals with error handling and submission states ([96d7169](96d7169))
* Expose registry endpoints on feature server for MCP access ([f77981c](f77981c))
* Feast First-Class LabelView Implementation ([#6292](#6292)) ([c0e7e5d](c0e7e5d))
* Feast-MLflow Integration ([#6235](#6235)) ([7279c75](7279c75))
* Operational metrics for offline store and SOX metrics for both ([#6340](#6340)) ([65b1b80](65b1b80))
* Pre-compute feature service ([8011550](8011550))
* REST API-backed UI for RBAC compatibility and per-page lazy loading ([#6414](#6414)) ([6ae80af](6ae80af))
* Support non-string map key types ([#6382](#6382)) ([#6383](#6383)) ([728aa2e](728aa2e))
* Update FeatureStore CRD with DRA Fields ([01241e4](01241e4))

### Performance Improvements

* Cache feature view resolution in get_online_features to reduce per-request overhead ([55c2f18](55c2f18))
* Optimize feature serving latency with batched async Redis, cached checks fix ([103809a](103809a))
* Replace MessageToDict with optimized custom dict builder ([#6015](#6015)) ([9902064](9902064))
Srihari1192 pushed a commit to Srihari1192/feast that referenced this pull request Jun 22, 2026
@feast-ci-bot Srihari Venkataramaiah
chore(release): release 0.64.0
22c3721
# [0.64.0](feast-dev/feast@v0.63.0...v0.64.0) (2026-06-13)

### Bug Fixes

* Add async_supported property to RedisOnlineStore ([9b088fe](feast-dev@9b088fe))
* Add missing feast init templates to operator CRD and enhance persistence documentation ([1941d4d](feast-dev@1941d4d))
* Allow to publish from reference branch ([5458ec8](feast-dev@5458ec8))
* API calls list ([4203eb7](feast-dev@4203eb7))
* **bigquery:** Enable list inference for parquet loads in offline_write_batch ([9243497](feast-dev@9243497)), closes [feast-dev#5845](feast-dev#5845)
* Bump grpcio dependencies ([07b4782](feast-dev@07b4782))
* **compute-engine/local:** Honor field_mapping on join keys in dedup + join nodes ([feast-dev#6395](feast-dev#6395)) ([bd01824](feast-dev@bd01824))
* **dynamodb:** Avoid tag race condition by using diff-based tag updates ([feast-dev#6479](feast-dev#6479)) ([bad2b7d](feast-dev@bad2b7d)), closes [feast-dev#6418](feast-dev#6418)
* **dynamodb:** Fix mypy type for _build_projection_expression return ([217b4da](feast-dev@217b4da))
* Fix intermittent async test failures for DynamoDB and Redis ([63c5eb1](feast-dev@63c5eb1))
* Fix mongodb blog title ([57d28d4](feast-dev@57d28d4))
* Fix shared SQL registry crash - avoid unnecessary UDF deserialization in proto cache building ([ac588d7](feast-dev@ac588d7))
* Fix SparkRetrievalJob.persist() failing for SparkSource ([209d7cd](feast-dev@209d7cd))
* Fixed formatting and image for mongo blog ([feast-dev#6377](feast-dev#6377)) ([f8389fb](feast-dev@f8389fb))
* Fixes for ray source ([7f592a4](feast-dev@7f592a4))
* **go:** skip registry refresh when cache_ttl_seconds <= 0 ([97ed40c](feast-dev@97ed40c))
* Handle array of strings columns in Athena materialization ([feast-dev#6324](feast-dev#6324)) ([4ed0278](feast-dev@4ed0278))
* make milvus VARCHAR max_length configurable, remove hardcoded 512 limit ([3b98c22](feast-dev@3b98c22))
* **operator:** Set appProtocol: grpc on registry gRPC Service ([feast-dev#6367](feast-dev#6367)) ([c9ae2b4](feast-dev@c9ae2b4))
* PyJWT 2.10+ added validation that rejects empty HMAC keys ([e756ffe](feast-dev@e756ffe))
* RemoteOnlineStore sends all features in a single HTTP request ([8f187dd](feast-dev@8f187dd))
* Remove registry proto dump to enforce RBAC and add permission checks to Commit/Refresh RPCs ([328431f](feast-dev@328431f))
* Remove selector migration job - no longer needed ([51c325e](feast-dev@51c325e))
* replace broken .claude skill symlink with correct relative path ([4541690](feast-dev@4541690))
* Replace selector label strip patch with migration Job for upgrade-safe selector uniqueness ([00dea50](feast-dev@00dea50))
* Scope feature view name conflict check to current project in file-based registry ([feast-dev#6369](feast-dev#6369)) ([a4fde83](feast-dev@a4fde83)), closes [feast-dev#6209](feast-dev#6209)
* **snowflake:** Stop double-quoting connection identifiers ([feast-dev#6462](feast-dev#6462)) ([e914d59](feast-dev@e914d59))
* **spark:** S3/GCS PyArrow filesystem resolution for staging paths ([feast-dev#6442](feast-dev#6442)) ([ae50414](feast-dev@ae50414))
* **trino:** Clean up temporary entity tables after retrieval ([feast-dev#6381](feast-dev#6381)) ([d86b13d](feast-dev@d86b13d)), closes [feast-dev#6306](feast-dev#6306)
* Update go-feature-server base image to Go 1.25 and fix operator Dockerfile COPY permissions ([86ef0bc](feast-dev@86ef0bc))

### Features

* [Backend] Data Quality Monitoring with native compute, multi-backend support, REST API, CLI ([feast-dev#6202](feast-dev#6202)) ([5458c37](feast-dev@5458c37))
* Add apache flink compute engine ([feast-dev#6476](feast-dev#6476)) ([9636d6a](feast-dev@9636d6a))
* Add demo noteboooks for users ([e362173](feast-dev@e362173))
* Add enabled/disabled toggle for feature views ([feast-dev#6401](feast-dev#6401)) ([5f1fa0d](feast-dev@5f1fa0d)), closes [feast-dev#6395](feast-dev#6395)
* Add Label View to init template ([ec272d5](feast-dev@ec272d5))
* Add mTLS support to remote registry gRPC client ([feast-dev#6474](feast-dev#6474)) ([c9602d8](feast-dev@c9602d8))
* Add Prometheus gauges for FeatureStore installation telemetry ([feast-dev#6354](feast-dev#6354)) ([1b681b7](feast-dev@1b681b7))
* Adds registry REST API endpoints for managing entities, data sources, and feature views ([feast-dev#6413](feast-dev#6413)) ([f77bd1d](feast-dev@f77bd1d))
* Allow CRUD on entities, data sources, and feature views from UI ([feast-dev#6412](feast-dev#6412)) ([2321c07](feast-dev@2321c07))
* Allow default openlineage configuration ([feast-dev#6467](feast-dev#6467)) ([276b6df](feast-dev@276b6df))
* **bigquery:** Support DATE-type event timestamp columns ([feast-dev#6362](feast-dev#6362)) ([753dee5](feast-dev@753dee5)), closes [feast-dev#2530](feast-dev#2530)
* **cli:** Add `feast projects delete` command (closes [feast-dev#5095](feast-dev#5095)) ([feast-dev#6318](feast-dev#6318)) ([1a4b96c](feast-dev@1a4b96c))
* Data Quality Monitoring added in feast UI ([feast-dev#6422](feast-dev#6422)) ([fa271be](feast-dev@fa271be))
* **dynamodb:** Use ProjectionExpression when requested_features is set ([0adc906](feast-dev@0adc906)), closes [feast-dev#6058](feast-dev#6058)
* Enhance DataSource and FeatureView modals with error handling and submission states ([96d7169](feast-dev@96d7169))
* Expose registry endpoints on feature server for MCP access ([f77981c](feast-dev@f77981c))
* Feast First-Class LabelView Implementation ([feast-dev#6292](feast-dev#6292)) ([c0e7e5d](feast-dev@c0e7e5d))
* Feast-MLflow Integration ([feast-dev#6235](feast-dev#6235)) ([7279c75](feast-dev@7279c75))
* Operational metrics for offline store and SOX metrics for both ([feast-dev#6340](feast-dev#6340)) ([65b1b80](feast-dev@65b1b80))
* Pre-compute feature service ([8011550](feast-dev@8011550))
* REST API-backed UI for RBAC compatibility and per-page lazy loading ([feast-dev#6414](feast-dev#6414)) ([6ae80af](feast-dev@6ae80af))
* Support non-string map key types ([feast-dev#6382](feast-dev#6382)) ([feast-dev#6383](feast-dev#6383)) ([728aa2e](feast-dev@728aa2e))
* Update FeatureStore CRD with DRA Fields ([01241e4](feast-dev@01241e4))

### Performance Improvements

* Cache feature view resolution in get_online_features to reduce per-request overhead ([55c2f18](feast-dev@55c2f18))
* Optimize feature serving latency with batched async Redis, cached checks fix ([103809a](feast-dev@103809a))
* Replace MessageToDict with optimized custom dict builder ([feast-dev#6015](feast-dev#6015)) ([9902064](feast-dev@9902064))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@franciscojavierarceo franciscojavierarceo franciscojavierarceo left review comments
@jyejare jyejare jyejare left review comments
@devin-ai-integration devin-ai-integration[bot] devin-ai-integration[bot] left review comments
@ntkathole ntkathole ntkathole approved these changes
+1 more reviewer
@github-advanced-security github-advanced-security[bot] github-advanced-security[bot] left review comments
Reviewers whose approvals may not affect merge requirements

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

ok-to-test

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

5 participants

@Vperiodt @franciscojavierarceo @ntkathole @jyejare @github-advanced-security
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.