Skip to content

Commit f215de9

Browse files
authored
Merge branch 'master' into docs/doc-embedder-pr-5973
2 parents 4fa9e9d + c8fd816 commit f215de9

154 files changed

Lines changed: 18274 additions & 10927 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/operator-e2e-integration-tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ jobs:
5252
- name: Set up Go
5353
uses: actions/setup-go@v5
5454
with:
55-
go-version: 1.22.9
55+
go-version: 1.24.12
5656

5757
- name: Create KIND cluster
5858
run: |

.github/workflows/operator_pr.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
- name: Install Go
1515
uses: actions/setup-go@v5
1616
with:
17-
go-version: 1.22.9
17+
go-version: 1.24.12
1818
- name: Operator tests
1919
run: make -C infra/feast-operator test
2020
- name: After code formatting, check for uncommitted differences

.github/workflows/pr_integration_tests.yml

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,80 @@ jobs:
9696
run: make test-python-integration
9797
- name: Minimize uv cache
9898
run: uv cache prune --ci
99+
100+
mcp-feature-server-runtime:
101+
if:
102+
((github.event.action == 'labeled' && (github.event.label.name == 'approved' || github.event.label.name == 'lgtm' || github.event.label.name == 'ok-to-test')) ||
103+
(github.event.action != 'labeled' && (contains(github.event.pull_request.labels.*.name, 'ok-to-test') || contains(github.event.pull_request.labels.*.name, 'approved') || contains(github.event.pull_request.labels.*.name, 'lgtm')))) &&
104+
github.repository == 'feast-dev/feast'
105+
runs-on: ubuntu-latest
106+
steps:
107+
- uses: actions/checkout@v4
108+
with:
109+
ref: refs/pull/${{ github.event.pull_request.number }}/merge
110+
submodules: recursive
111+
persist-credentials: false
112+
- name: Setup Python
113+
uses: actions/setup-python@v5
114+
with:
115+
python-version: "3.11"
116+
architecture: x64
117+
- name: Install the latest version of uv
118+
uses: astral-sh/setup-uv@v5
119+
with:
120+
enable-cache: true
121+
- name: Install dependencies
122+
run: make install-python-dependencies-ci
123+
- name: Start feature server (MCP HTTP)
124+
run: |
125+
cd examples/mcp_feature_store
126+
uv run python -m feast.cli.cli serve --host 127.0.0.1 --port 6566 --workers 1 --no-access-log &
127+
SERVER_PID=$!
128+
echo $SERVER_PID > /tmp/feast_server_pid
129+
for i in $(seq 1 60); do
130+
kill -0 "$SERVER_PID" || { echo "server died"; exit 1; }
131+
if curl -fsS http://127.0.0.1:6566/health >/dev/null; then
132+
break
133+
fi
134+
sleep 1
135+
done
136+
curl -fsS http://127.0.0.1:6566/health >/dev/null
137+
- name: Validate MCP endpoint
138+
run: |
139+
rm -f /tmp/mcp_headers /tmp/mcp_headers2 /tmp/mcp_body2
140+
141+
curl -sS -D /tmp/mcp_headers -o /dev/null --max-time 10 \
142+
-X POST \
143+
-H "Accept: application/json, text/event-stream" \
144+
-H "Content-Type: application/json" \
145+
-H "mcp-protocol-version: 2025-03-26" \
146+
--data '{}' \
147+
http://127.0.0.1:6566/mcp
148+
149+
SESSION_ID=$(grep -i "^mcp-session-id:" /tmp/mcp_headers | head -1 | awk '{print $2}' | tr -d '\r')
150+
if [ -z "${SESSION_ID}" ]; then
151+
cat /tmp/mcp_headers || true
152+
exit 1
153+
fi
154+
155+
curl -sS -D /tmp/mcp_headers2 -o /tmp/mcp_body2 --max-time 10 \
156+
-X POST \
157+
-H "Accept: application/json, text/event-stream" \
158+
-H "Content-Type: application/json" \
159+
-H "mcp-protocol-version: 2025-03-26" \
160+
-H "mcp-session-id: ${SESSION_ID}" \
161+
--data '{}' \
162+
http://127.0.0.1:6566/mcp
163+
164+
grep -Eq "^HTTP/.* 400" /tmp/mcp_headers2
165+
grep -Eiq "^content-type: application/json" /tmp/mcp_headers2
166+
grep -Eiq "^mcp-session-id: ${SESSION_ID}" /tmp/mcp_headers2
167+
- name: Stop feature server
168+
if: always()
169+
run: |
170+
if [ -f /tmp/feast_server_pid ]; then
171+
kill "$(cat /tmp/feast_server_pid)" || true
172+
fi
173+
- name: Minimize uv cache
174+
if: always()
175+
run: uv cache prune --ci

.github/workflows/pr_local_integration_tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ jobs:
5959
- name: Install Go
6060
uses: actions/setup-go@v5
6161
with:
62-
go-version: 1.22.9
62+
go-version: 1.24.12
6363
- name: Operator Data Source types test
6464
run: make -C infra/feast-operator test-datasources
6565
- name: Minimize uv cache

.github/workflows/registry-rest-api-tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ jobs:
5050
- name: Set up Go
5151
uses: actions/setup-go@v5
5252
with:
53-
go-version: 1.22.9
53+
go-version: 1.24.12
5454

5555
- name: Create KIND cluster
5656
run: |

.github/workflows/release.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ jobs:
4949
- name: Checkout
5050
uses: actions/checkout@v4
5151
with:
52+
fetch-depth: 0
5253
persist-credentials: false
5354
- name: Setup Node.js
5455
uses: actions/setup-node@v3
@@ -76,6 +77,8 @@ jobs:
7677
NEXT_VERSION: ${{ needs.get_dry_release_versions.outputs.next_version }}
7778
steps:
7879
- uses: actions/checkout@v4
80+
with:
81+
fetch-depth: 0
7982
- name: Setup Node.js
8083
uses: actions/setup-node@v3
8184
with:
@@ -108,7 +111,7 @@ jobs:
108111
- name: Install Go
109112
uses: actions/setup-go@v2
110113
with:
111-
go-version: 1.22.9
114+
go-version: 1.24.12
112115
- name: Build & version operator-specific release files
113116
run: make -C infra/feast-operator build-installer bundle
114117

@@ -126,6 +129,7 @@ jobs:
126129
- name: Checkout
127130
uses: actions/checkout@v4
128131
with:
132+
fetch-depth: 0
129133
persist-credentials: false
130134
- name: Setup Node.js
131135
uses: actions/setup-node@v3
@@ -140,7 +144,7 @@ jobs:
140144
- name: Install Go
141145
uses: actions/setup-go@v2
142146
with:
143-
go-version: 1.22.9
147+
go-version: 1.24.12
144148
- name: Compile Go Test Binaries
145149
run: |
146150
cd infra/feast-operator
@@ -172,6 +176,7 @@ jobs:
172176
- name: Checkout code
173177
uses: actions/checkout@v4
174178
with:
179+
fetch-depth: 0
175180
persist-credentials: false
176181

177182
- name: Set up Git credentials

.secrets.baseline

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,7 @@
934934
"filename": "infra/feast-operator/api/v1/featurestore_types.go",
935935
"hashed_secret": "44e17306b837162269a410204daaa5ecee4ec22c",
936936
"is_verified": false,
937-
"line_number": 729
937+
"line_number": 761
938938
}
939939
],
940940
"infra/feast-operator/api/v1/zz_generated.deepcopy.go": [
@@ -943,21 +943,21 @@
943943
"filename": "infra/feast-operator/api/v1/zz_generated.deepcopy.go",
944944
"hashed_secret": "f914fc9324de1bec1ad13dec94a8ea2ddb41fc87",
945945
"is_verified": false,
946-
"line_number": 686
946+
"line_number": 693
947947
},
948948
{
949949
"type": "Secret Keyword",
950950
"filename": "infra/feast-operator/api/v1/zz_generated.deepcopy.go",
951951
"hashed_secret": "44e17306b837162269a410204daaa5ecee4ec22c",
952952
"is_verified": false,
953-
"line_number": 1254
953+
"line_number": 754
954954
},
955955
{
956956
"type": "Secret Keyword",
957957
"filename": "infra/feast-operator/api/v1/zz_generated.deepcopy.go",
958958
"hashed_secret": "c2028031c154bbe86fd69bef740855c74b927dcf",
959959
"is_verified": false,
960-
"line_number": 1259
960+
"line_number": 1300
961961
}
962962
],
963963
"infra/feast-operator/api/v1alpha1/featurestore_types.go": [
@@ -1140,14 +1140,14 @@
11401140
"filename": "infra/feast-operator/internal/controller/services/repo_config.go",
11411141
"hashed_secret": "44e17306b837162269a410204daaa5ecee4ec22c",
11421142
"is_verified": false,
1143-
"line_number": 109
1143+
"line_number": 114
11441144
},
11451145
{
11461146
"type": "Secret Keyword",
11471147
"filename": "infra/feast-operator/internal/controller/services/repo_config.go",
11481148
"hashed_secret": "e2fb052132fd6a07a56af2013e0b62a1f510572c",
11491149
"is_verified": false,
1150-
"line_number": 148
1150+
"line_number": 205
11511151
}
11521152
],
11531153
"infra/feast-operator/internal/controller/services/services.go": [
@@ -1539,5 +1539,5 @@
15391539
}
15401540
]
15411541
},
1542-
"generated_at": "2026-03-18T13:51:43Z"
1542+
"generated_at": "2026-04-07T15:56:56Z"
15431543
}

AGENTS.md

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
# Feast - Agent Instructions
2+
3+
This file provides instructions for AI coding agents (GitHub Copilot, Claude Code, OpenAI Codex, etc.) working in this repository.
4+
5+
## Project Overview
6+
7+
Feast is an open source feature store for machine learning that helps ML platform teams manage features consistently for training and serving.
8+
9+
Feast (Feature Store) is a Python-based project that provides:
10+
- **Offline Store**: Process historical data for batch scoring or model training
11+
- **Online Store**: Power real-time predictions with low-latency features
12+
- **Feature Server**: Serve pre-computed features online
13+
- **Point-in-time correctness**: Prevent data leakage during model training
14+
- **Data infrastructure abstraction**: Decouple ML from data infrastructure
15+
16+
## Development Commands
17+
18+
### Setup
19+
```bash
20+
# Install development dependencies
21+
make install-python-dependencies-dev
22+
23+
# Install minimal dependencies
24+
make install-python-dependencies-minimal
25+
```
26+
27+
### Code Quality
28+
```bash
29+
# Format Python code
30+
make format-python
31+
32+
# Lint Python code
33+
make lint-python
34+
35+
# Type check
36+
cd sdk/python && python -m mypy feast
37+
```
38+
39+
### Testing
40+
```bash
41+
# Run unit tests
42+
make test-python-unit
43+
44+
# Run integration tests (local)
45+
make test-python-integration-local
46+
47+
# Run integration tests (CI)
48+
make test-python-integration
49+
50+
# Run all Python tests
51+
make test-python-universal
52+
```
53+
54+
### Protobuf Compilation
55+
```bash
56+
# Compile Python protobuf files
57+
make compile-protos-python
58+
59+
# Compile all protos
60+
make protos
61+
```
62+
63+
### Go Development
64+
```bash
65+
# Build Go code
66+
make build-go
67+
68+
# Test Go code
69+
make test-go
70+
71+
# Format Go code
72+
make format-go
73+
74+
# Lint Go code
75+
make lint-go
76+
```
77+
78+
### Docker
79+
```bash
80+
# Build all Docker images
81+
make build-docker
82+
83+
# Build feature server Docker image
84+
make build-feature-server-docker
85+
```
86+
87+
### Documentation
88+
```bash
89+
# Build Sphinx documentation
90+
make build-sphinx
91+
92+
# Build templates
93+
make build-templates
94+
95+
# Build Helm docs
96+
make build-helm-docs
97+
```
98+
99+
## Project Structure
100+
101+
```
102+
feast/
103+
├── sdk/python/ # Python SDK and core implementation
104+
├── go/ # Go implementation
105+
├── ui/ # Web UI
106+
├── docs/ # Documentation
107+
├── examples/ # Example projects
108+
├── infra/ # Infrastructure and deployment
109+
│ ├── charts/ # Helm charts
110+
│ └── feast-operator/ # Kubernetes operator
111+
└── protos/ # Protocol buffer definitions
112+
```
113+
114+
## Key Technologies
115+
116+
- **Languages**: Python (primary), Go
117+
- **Dependencies**: pandas, pyarrow, SQLAlchemy, FastAPI, protobuf
118+
- **Data Sources**: BigQuery, Snowflake, Redshift, Parquet, Postgres, Spark
119+
- **Online Stores**: Redis, DynamoDB, Bigtable, Snowflake, SQLite, Postgres
120+
- **Offline Stores**: BigQuery, Snowflake, Redshift, Spark, Dask, DuckDB
121+
- **Cloud Providers**: AWS, GCP, Azure
122+
123+
## Common Development Tasks
124+
125+
### Running Tests
126+
The project uses pytest for Python testing with extensive integration test suites for different data sources and stores.
127+
128+
### Code Style
129+
- Use type hints on all Python function signatures
130+
- Follow existing patterns in the module you are modifying
131+
- PR titles must follow semantic conventions: `feat:`, `fix:`, `ci:`, `chore:`, `docs:`
132+
- Sign off commits with `git commit -s` (DCO requirement)
133+
- Uses `ruff` for Python linting and formatting
134+
- Go uses standard `gofmt`
135+
136+
### Protobuf Development
137+
Protocol buffers are used for data serialization and gRPC APIs. Recompile protos after making changes to `.proto` files.
138+
139+
### Multi-language Support
140+
Feast supports Python and Go SDKs. Changes to core functionality may require updates across both languages.
141+
142+
## Documentation and Blog Posts
143+
144+
- **Blog posts must be placed in `/infra/website/docs/blog/`** — do NOT create blog posts under `docs/blog/` or any other location.
145+
- Blog post files must include YAML frontmatter with `title`, `description`, `date`, and `authors` fields, following the format of existing posts in that directory.
146+
- All other reference documentation goes under `docs/`.
147+
148+
## Contributing
149+
150+
1. Follow the [contribution guide](docs/project/contributing.md)
151+
2. Set up your development environment
152+
3. Run relevant tests before submitting PRs
153+
4. Ensure code passes linting and type checking

0 commit comments

Comments
 (0)