Skip to content

feat: Making feast vector store with open ai search api compatible#6121

Open
patelchaitany wants to merge 3 commits into
feast-dev:masterfrom
patelchaitany:enh/openai-compatibel-store-api
Open

feat: Making feast vector store with open ai search api compatible#6121
patelchaitany wants to merge 3 commits into
feast-dev:masterfrom
patelchaitany:enh/openai-compatibel-store-api

Conversation

@patelchaitany
Copy link
Copy Markdown
Contributor

@patelchaitany patelchaitany commented Mar 17, 2026

What this PR does / why we need it:

This PR making the feast vector store api with open ai search api compatible so.

This are the changes are made.

  1. New OpenAI-compatible endpoint
  • Added POST /v1/vector_stores/{vector_store_id}/search that matches the OpenAI vector store search API
  • vector_store_id just maps to a feature view name
  • Takes a query string, embeds it via LiteLLM, calls retrieve_online_documents_v2, and returns results in OpenAI's vector_store.search_results.page format
  • LiteLLM embedding config goes in feature_store.yaml under a new embedding_model section (model, api_key, api_base, api_version, dimensions
  1. Metadata filtering
  • New filter_models.py with two Pydantic models: ComparisonFilter (eq, ne, gt, gte, lt, lte, in, nin) and CompoundFilter (and/or, nestable)
  • Threaded filters through the entire retrieval stack down to each online store
  • Each store translates filters into its native query language:
    • Elasticsearch: Query DSL clauses (term, range, terms, bool)
    • Milvus: boolean expressions like field == 'value'
    • Postgres: parameterized SQL subqueries with entity_key IN (SELECT ...)
    • SQLite: same approach as Postgres, SQLite syntax
  1. Numeric storage fix
  • Without this change, all values are stored as text, so '9' > '100' is true in filters
  • New enable_openai_compatible_store config flag on every store backend
  • When enabled, adds a value_num column that stores int, float, double, and bool values natively alongside the existing `value_text
  1. Bug fixes picked up along the way
  • SQLite BM25 search was reading raw value instead of value_text
  • SQLite's query param renamed to embedding since that's what it actually is
  • Added input escaping for Milvus query strings
  1. Tests
  • 160 lines of unit tests for filter models (valid/invalid operators, value types, nested compounds)
  • ~320 lines of integration tests covering filtered vector search, filtered text search, OpenAI response shape, and error cases (no embedding config, nonexistent feature view, empty results)

Which issue(s) this PR fixes:

#5615

Misc


Open with Devin

@ntkathole ntkathole changed the title feat: making feast vector store with open ai search api compatible feat: Making feast vector store with open ai search api compatible Mar 17, 2026
@patelchaitany patelchaitany force-pushed the enh/openai-compatibel-store-api branch 4 times, most recently from e45f167 to c8392a9 Compare March 23, 2026 11:17
@patelchaitany patelchaitany changed the title feat: Making feast vector store with open ai search api compatible feat: Making feast vector store with open ai search api compatible Mar 23, 2026
@patelchaitany patelchaitany force-pushed the enh/openai-compatibel-store-api branch 5 times, most recently from 7e8adfb to 3f541ad Compare March 24, 2026 11:29
@patelchaitany patelchaitany marked this pull request as ready for review March 24, 2026 11:29
@patelchaitany patelchaitany requested review from a team as code owners March 24, 2026 11:29
@patelchaitany patelchaitany requested review from HaoXuAI, nquinn408 and redhatHameed and removed request for a team March 24, 2026 11:29
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

@patelchaitany patelchaitany force-pushed the enh/openai-compatibel-store-api branch from cd692b9 to 086bed5 Compare March 30, 2026 12:05
devin-ai-integration[bot]

This comment was marked as resolved.

@patelchaitany patelchaitany force-pushed the enh/openai-compatibel-store-api branch from 086bed5 to 9778002 Compare March 30, 2026 12:51
devin-ai-integration[bot]

This comment was marked as resolved.

@patelchaitany patelchaitany force-pushed the enh/openai-compatibel-store-api branch 2 times, most recently from 68c843c to e29e557 Compare March 31, 2026 07:05
devin-ai-integration[bot]

This comment was marked as resolved.

@patelchaitany patelchaitany force-pushed the enh/openai-compatibel-store-api branch 2 times, most recently from f0552c7 to dafe9fd Compare March 31, 2026 09:26
devin-ai-integration[bot]

This comment was marked as resolved.

@patelchaitany patelchaitany force-pushed the enh/openai-compatibel-store-api branch 4 times, most recently from 639bada to c879c9e Compare May 11, 2026 13:12
@patelchaitany patelchaitany requested a review from ntkathole May 12, 2026 03:45
Comment thread sdk/python/feast/feature_store.py Outdated
``vector_store_id`` path parameter).
query: Natural language query string, or list of strings.
max_num_results: Maximum number of results to return.
filters: OpenAI-compatible filters (accepted but not yet
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

filters are accepted and applied as well

Comment thread sdk/python/feast/feature_server.py Outdated
value: Union[str, int, float, bool, List[Union[str, int]]]


class OpenAICompoundFilter(BaseModel):
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think these all are not needed now, it's duplicate of filter_models.py definitions

Comment thread sdk/python/feast/embedder.py Outdated
...


class LiteLLMEmbeddingProvider:
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
class LiteLLMEmbeddingProvider:
class LiteLLMEmbeddingProvider(EmbeddingProvider):

Comment thread sdk/python/feast/feature_server.py Outdated
"/v1/vector_stores/{vector_store_id}/search"
):
try:
result = await run_in_threadpool(
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The entire call including the embedding network I/O is wrapped in run_in_threadpool, which blocks a thread waiting for the OpenAI/Ollama HTTP response. LiteLLMEmbeddingProvider.aembed() exists precisely to avoid this. Make retrieve_online_documents_openai async, call await self.embedding_provider.aembed(...) inside it, and then await run_in_threadpool only for the DB retrieval step. The endpoint can then await store.retrieve_online_documents_openai(...) directly without an outer run_in_threadpool.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done. retrieve_online_documents_openai is now async with await aembed(...). The retrieve_online_documents_v2 call is still in run_in_threadpool since it has no async variant.

Comment thread sdk/python/feast/feature_server.py Outdated
query=request.query,
max_num_results=request.max_num_results or 10,
filters=(
request.filters.model_dump() if request.filters else None
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

request.filters.model_dump() can be removed once line 146 uses ComparisonFilter/CompoundFilter directly

@patelchaitany patelchaitany force-pushed the enh/openai-compatibel-store-api branch 2 times, most recently from e7ba622 to 502286f Compare May 14, 2026 11:26
@patelchaitany patelchaitany requested a review from ntkathole May 15, 2026 04:06
---
title: "Making Feast Speak OpenAI: Vector Search Without the Glue Code"
description: "Feast now exposes an OpenAI-compatible vector store search endpoint. Send a plain text query, get results back in the standard OpenAI format. No client-side embeddings required."
date: 2026-04-28
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

update date before merge

@ntkathole
Copy link
Copy Markdown
Member

ntkathole commented May 15, 2026

Also add documentation for OpenAI-compatible Vector search endpoint in docs/reference/alpha-vector-database.md and docs/reference/feature-servers/python-feature-server.md

Also, missing docs for how user can use different embedding provider other than litellm

@patelchaitany patelchaitany force-pushed the enh/openai-compatibel-store-api branch from 502286f to 925eb2e Compare May 15, 2026 05:49
@patelchaitany patelchaitany requested a review from ntkathole May 15, 2026 05:50
@patelchaitany patelchaitany force-pushed the enh/openai-compatibel-store-api branch from 925eb2e to c2782f5 Compare May 15, 2026 06:31
Copy link
Copy Markdown
Member

@ntkathole ntkathole left a 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!

@franciscojavierarceo will you be able to take a look once?

@patelchaitany
Copy link
Copy Markdown
Contributor Author

@ntkathole, The CI for the mcp-feature-server-runtime was failing because fastapi_mcp does not handle circular references properly. To fix this, I made changes in mcp_server.py where we inserted a custom schema resolver that handles how reference schemas are resolved. I also verified its logic against the original fastapi_mcp logic -- both produce the same output when there are no self-referencing schemas.

@patelchaitany patelchaitany requested a review from ntkathole May 19, 2026 07:32
@patelchaitany patelchaitany force-pushed the enh/openai-compatibel-store-api branch 4 times, most recently from 58dcb47 to ba5ad00 Compare May 20, 2026 11:19
@ntkathole ntkathole force-pushed the enh/openai-compatibel-store-api branch from ba5ad00 to 180d80f Compare May 21, 2026 05:05
Signed-off-by: Chaitany patel <patelchaitany93@gmail.com>
Signed-off-by: Chaitany patel <patelchaitany93@gmail.com>
…gistration

fastapi_mcp 0.4.0 resolve_schema_references() has no cycle detection.
Feast's OpenAPI schema contains self-referential protobuf types
(Value -> Struct -> Value) which trigger a RecursionError.  The error
is silently caught, so the /mcp route never gets registered and CI
gets a 404.
Add _resolve_schema_references_safe() that tracks a seen-refs set to
break circular  chains, and monkey-patch it into fastapi_mcp
before FastApiMCP processes the schema.  Non-circular schemas produce
identical output to the original.

Signed-off-by: Chaitany patel <patelchaitany93@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants