embedflow 0.3.0__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {embedflow-0.3.0 → embedflow-0.4.0}/CHANGELOG.md +9 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/CITATION.cff +1 -1
- {embedflow-0.3.0 → embedflow-0.4.0}/MANIFEST.in +1 -1
- {embedflow-0.3.0 → embedflow-0.4.0}/PKG-INFO +16 -5
- {embedflow-0.3.0 → embedflow-0.4.0}/README.md +10 -2
- {embedflow-0.3.0 → embedflow-0.4.0}/README_PYPI.md +11 -3
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/configuration.md +12 -1
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/installation.md +7 -0
- embedflow-0.4.0/docs/integrations/milvus.md +165 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/limitations.md +1 -1
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/releasing.md +7 -7
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/__init__.py +2 -2
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/cli.py +90 -23
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/evaluate.py +3 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/config.py +109 -6
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/indexes/__init__.py +2 -0
- embedflow-0.4.0/embedflow/indexes/milvus_backend.py +1056 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/migration/facade.py +43 -9
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/runtime.py +17 -4
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow.egg-info/PKG-INFO +16 -5
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow.egg-info/SOURCES.txt +9 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow.egg-info/requires.txt +4 -0
- embedflow-0.4.0/examples/milvus/README.md +39 -0
- embedflow-0.4.0/examples/milvus/compose.yaml +48 -0
- embedflow-0.4.0/examples/milvus/embedflow.yaml.example +26 -0
- embedflow-0.4.0/examples/milvus/run_demo.sh +15 -0
- embedflow-0.4.0/examples/pinecone/embedflow.yaml.example +35 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/pyproject.toml +4 -2
- embedflow-0.4.0/scripts/milvus_fixture.py +102 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/scripts/release_gate.py +17 -2
- embedflow-0.4.0/scripts/validate_milvus.py +356 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/scripts/validate_pgvector_10k.py +2 -2
- {embedflow-0.3.0 → embedflow-0.4.0}/CONTRIBUTING.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/LICENSE +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/SECURITY.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/api.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/assets/README.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/assets/candidate-gap-example.svg +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/assets/dashboard-screenshot.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/assets/terminal-demo.txt +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/cli.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/concepts.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/contributing-benchmarks.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/economics.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/integrations/faiss.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/integrations/pgvector.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/integrations/pinecone.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/integrations/qdrant.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/methodology.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/quickstart.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/docs/registry.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/__main__.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/analysis.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/api.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/cache/__init__.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/cache/base.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/cache/persistent_cache.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/__init__.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/candidate_gap.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/containment.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/metrics.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/migration_depth.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/probe.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/report.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/t2.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/__init__.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/__init__.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/benchmark_profiles.jsonl +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/checksums.sha256 +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/migrations.jsonl +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/registry_manifest.json +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/research_summaries.json +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/schema_version.json +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/frozen/T2_V1_FROZEN_SPEC.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/frozen/T2_V1_FROZEN_SPEC.sha256 +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/indexes/base.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/indexes/faiss_backend.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/indexes/pgvector_backend.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/indexes/pinecone_backend.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/indexes/qdrant_backend.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/metrics/__init__.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/metrics/latency.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/migration/__init__.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/migration/compatibility.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/migration/materializer.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/migration/planner.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/migration/state.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/models/__init__.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/models/base.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/models/huggingface.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/registry/__init__.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/registry/loader.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/registry/matcher.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/registry/schema.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/serving/__init__.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/serving/api.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/serving/engine.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/serving/factory.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/serving/schemas.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow.egg-info/dependency_links.txt +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow.egg-info/entry_points.txt +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/embedflow.egg-info/top_level.txt +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/faiss/README.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/faiss/documents.jsonl +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/faiss/embedflow.yaml +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/faiss/queries.jsonl +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/README.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/build_index.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/compose.yaml +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/embedflow.yaml +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/init.sql +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/queries.jsonl +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/run_demo.sh +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/pinecone/README.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/pinecone/run_smoke.sh +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/qdrant/README.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/qdrant/build_index.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/qdrant/documents.jsonl +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/qdrant/embedflow.yaml +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/qdrant/queries.jsonl +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/research_analysis/README.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/research_analysis/documents.jsonl +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/research_analysis/embedflow.yaml +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/research_analysis/qrels.json +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/examples/research_analysis/queries.jsonl +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/frozen/T2_V1_FROZEN_SPEC.md +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/frozen/T2_V1_FROZEN_SPEC.sha256 +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/requirements-dev.txt +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/requirements.txt +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/scripts/pinecone_smoke.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/scripts/real_qdrant_smoke.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/scripts/run_demo.sh +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/scripts/run_tests.sh +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/setup.cfg +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/src/__init__.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/src/embed.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/src/probe_features.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/src/storage.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/src/t2_v1.py +0 -0
- {embedflow-0.3.0 → embedflow-0.4.0}/src/utils.py +0 -0
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.4.0 — Milvus backend
|
|
4
|
+
|
|
5
|
+
- Added a read-only Milvus backend for existing dense `FLOAT_VECTOR`
|
|
6
|
+
collections.
|
|
7
|
+
- Added collection/database/partition selection, HNSW/IVF search parameters,
|
|
8
|
+
metric and schema auditing, and Milvus-backed document text resolution.
|
|
9
|
+
- Added deterministic standalone Docker fixtures, examples, and optional
|
|
10
|
+
`pymilvus` packaging.
|
|
11
|
+
|
|
3
12
|
## v0.3.0 — Pinecone backend
|
|
4
13
|
|
|
5
14
|
- Added a read-only Pinecone backend for existing dense indexes.
|
|
@@ -2,7 +2,7 @@ cff-version: 1.2.0
|
|
|
2
2
|
title: "EmbedFlow: Upgrading Legacy Embeddings Without Full Upfront Re-Embedding"
|
|
3
3
|
message: "If EmbedFlow contributes to your work, please cite this software release."
|
|
4
4
|
type: software
|
|
5
|
-
version: 0.
|
|
5
|
+
version: 0.4.0
|
|
6
6
|
date-released: 2026-09-06
|
|
7
7
|
repository-code: "https://github.com/arnsri33/embedflow"
|
|
8
8
|
url: "https://github.com/arnsri33/embedflow"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
include README.md README_PYPI.md LICENSE CHANGELOG.md CONTRIBUTING.md SECURITY.md CITATION.cff requirements.txt requirements-dev.txt
|
|
2
2
|
recursive-include docs *
|
|
3
|
-
recursive-include examples *.md *.yaml *.json *.jsonl *.py *.sql *.sh
|
|
3
|
+
recursive-include examples *.md *.yaml *.yaml.example *.json *.jsonl *.py *.sql *.sh
|
|
4
4
|
recursive-include scripts *.sh *.py
|
|
5
5
|
recursive-include frozen *.md *.sha256
|
|
6
6
|
prune .github
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: embedflow
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: Progressive embedding-model migration over existing vector indexes.
|
|
5
5
|
Author: Arnav Srivastav
|
|
6
6
|
License-Expression: AGPL-3.0-only
|
|
@@ -8,7 +8,7 @@ Project-URL: Homepage, https://embedflow.org
|
|
|
8
8
|
Project-URL: Repository, https://github.com/arnsri33/embedflow
|
|
9
9
|
Project-URL: Documentation, https://github.com/arnsri33/embedflow#readme
|
|
10
10
|
Project-URL: Issues, https://github.com/arnsri33/embedflow/issues
|
|
11
|
-
Keywords: embeddings,vector-search,rag,information-retrieval,faiss,qdrant,pgvector,pinecone
|
|
11
|
+
Keywords: embeddings,vector-search,rag,information-retrieval,faiss,qdrant,pgvector,pinecone,milvus
|
|
12
12
|
Classifier: Development Status :: 3 - Alpha
|
|
13
13
|
Classifier: Intended Audience :: Developers
|
|
14
14
|
Classifier: Intended Audience :: Science/Research
|
|
@@ -31,6 +31,8 @@ Provides-Extra: pgvector
|
|
|
31
31
|
Requires-Dist: psycopg[binary]>=3.2; extra == "pgvector"
|
|
32
32
|
Provides-Extra: pinecone
|
|
33
33
|
Requires-Dist: pinecone>=6.0; extra == "pinecone"
|
|
34
|
+
Provides-Extra: milvus
|
|
35
|
+
Requires-Dist: pymilvus<4,>=2.5.5; extra == "milvus"
|
|
34
36
|
Provides-Extra: models
|
|
35
37
|
Requires-Dist: huggingface-hub<1.0,>=0.34; extra == "models"
|
|
36
38
|
Requires-Dist: transformers<5.0,>=4.45; extra == "models"
|
|
@@ -45,6 +47,7 @@ Requires-Dist: faiss-cpu>=1.8.0; extra == "all"
|
|
|
45
47
|
Requires-Dist: qdrant-client>=1.9; extra == "all"
|
|
46
48
|
Requires-Dist: psycopg[binary]>=3.2; extra == "all"
|
|
47
49
|
Requires-Dist: pinecone>=6.0; extra == "all"
|
|
50
|
+
Requires-Dist: pymilvus<4,>=2.5.5; extra == "all"
|
|
48
51
|
Requires-Dist: huggingface-hub<1.0,>=0.34; extra == "all"
|
|
49
52
|
Requires-Dist: transformers<5.0,>=4.45; extra == "all"
|
|
50
53
|
Requires-Dist: sentence-transformers>=3.0; extra == "all"
|
|
@@ -65,7 +68,7 @@ Dynamic: license-file
|
|
|
65
68
|
EmbedFlow lets a new embedding model serve over candidates from an existing
|
|
66
69
|
vector index while target document vectors are materialized progressively. It
|
|
67
70
|
supports migration analysis, persistent caching, background work, FAISS,
|
|
68
|
-
Qdrant, pgvector, Pinecone, a CLI, and FastAPI.
|
|
71
|
+
Qdrant, pgvector, Pinecone, Milvus, a CLI, and FastAPI.
|
|
69
72
|
|
|
70
73
|
The full project README and architecture diagram are on
|
|
71
74
|
<https://github.com/arnsri33/embedflow>.
|
|
@@ -94,6 +97,12 @@ For an existing Pinecone dense index:
|
|
|
94
97
|
python -m pip install "embedflow[pinecone]"
|
|
95
98
|
```
|
|
96
99
|
|
|
100
|
+
For an existing Milvus collection:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
python -m pip install "embedflow[milvus]"
|
|
104
|
+
```
|
|
105
|
+
|
|
97
106
|
Qdrant and model-runtime extras are documented in the
|
|
98
107
|
[installation guide](https://github.com/arnsri33/embedflow/blob/main/docs/installation.md).
|
|
99
108
|
For model-backed analysis, install `embedflow[faiss,models,dashboard]`.
|
|
@@ -196,11 +205,13 @@ for definitions and reproduction details.
|
|
|
196
205
|
| Qdrant | Supported |
|
|
197
206
|
| pgvector | Supported |
|
|
198
207
|
| Pinecone | Supported |
|
|
208
|
+
| Milvus | Supported |
|
|
199
209
|
|
|
200
210
|
See the [FAISS guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/faiss.md),
|
|
201
211
|
[Qdrant guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/qdrant.md),
|
|
202
212
|
and [pgvector guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/pgvector.md),
|
|
203
|
-
and [Pinecone guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/pinecone.md)
|
|
213
|
+
and [Pinecone guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/pinecone.md),
|
|
214
|
+
and [Milvus guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/milvus.md).
|
|
204
215
|
|
|
205
216
|
## CLI
|
|
206
217
|
|
|
@@ -220,7 +231,7 @@ cover the remaining commands and endpoints.
|
|
|
220
231
|
|
|
221
232
|
## Status
|
|
222
233
|
|
|
223
|
-
EmbedFlow v0.
|
|
234
|
+
EmbedFlow v0.4.0 is an alpha release for research and early real-world
|
|
224
235
|
testing. T2-v1 is an empirical finite-tail diagnostic, partial rankings can
|
|
225
236
|
differ from fully warm target reranking, and ANN fidelity needs a reference
|
|
226
237
|
comparison to audit.
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
EmbedFlow lets a new embedding model serve over candidates from an existing
|
|
8
8
|
vector index while target document vectors are materialized progressively. It
|
|
9
9
|
supports migration analysis, persistent caching, background work, and serving
|
|
10
|
-
through FAISS, Qdrant, pgvector, Pinecone, a CLI, and FastAPI.
|
|
10
|
+
through FAISS, Qdrant, pgvector, Pinecone, Milvus, a CLI, and FastAPI.
|
|
11
11
|
|
|
12
12
|
[Quickstart](#try-it) · [Documentation](#documentation) · [Research](#research)
|
|
13
13
|
|
|
@@ -58,6 +58,12 @@ For an existing Pinecone dense index:
|
|
|
58
58
|
python -m pip install "embedflow[pinecone]"
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
+
For an existing Milvus collection:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
python -m pip install "embedflow[milvus]"
|
|
65
|
+
```
|
|
66
|
+
|
|
61
67
|
Qdrant and model-runtime extras are documented in
|
|
62
68
|
[`docs/installation.md`](https://github.com/arnsri33/embedflow/blob/main/docs/installation.md).
|
|
63
69
|
For model-backed analysis, install `embedflow[faiss,models,dashboard]`.
|
|
@@ -197,6 +203,7 @@ is measured separately and is `UNKNOWN` until an exact reference is supplied.
|
|
|
197
203
|
| Qdrant | Supported |
|
|
198
204
|
| pgvector | Supported |
|
|
199
205
|
| Pinecone | Supported |
|
|
206
|
+
| Milvus | Supported |
|
|
200
207
|
|
|
201
208
|
Backend-specific setup and examples:
|
|
202
209
|
|
|
@@ -204,6 +211,7 @@ Backend-specific setup and examples:
|
|
|
204
211
|
- [Qdrant](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/qdrant.md)
|
|
205
212
|
- [pgvector](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/pgvector.md)
|
|
206
213
|
- [Pinecone](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/pinecone.md)
|
|
214
|
+
- [Milvus](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/milvus.md)
|
|
207
215
|
- [Adding a backend](https://github.com/arnsri33/embedflow/blob/main/CONTRIBUTING.md)
|
|
208
216
|
|
|
209
217
|
## CLI
|
|
@@ -238,7 +246,7 @@ OpenAPI documentation; see
|
|
|
238
246
|
|
|
239
247
|
## Status
|
|
240
248
|
|
|
241
|
-
EmbedFlow v0.
|
|
249
|
+
EmbedFlow v0.4.0 is an alpha release for research and early real-world
|
|
242
250
|
testing.
|
|
243
251
|
|
|
244
252
|
- T2-v1 reports an empirical finite-tail diagnostic.
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
EmbedFlow lets a new embedding model serve over candidates from an existing
|
|
6
6
|
vector index while target document vectors are materialized progressively. It
|
|
7
7
|
supports migration analysis, persistent caching, background work, FAISS,
|
|
8
|
-
Qdrant, pgvector, Pinecone, a CLI, and FastAPI.
|
|
8
|
+
Qdrant, pgvector, Pinecone, Milvus, a CLI, and FastAPI.
|
|
9
9
|
|
|
10
10
|
The full project README and architecture diagram are on
|
|
11
11
|
<https://github.com/arnsri33/embedflow>.
|
|
@@ -34,6 +34,12 @@ For an existing Pinecone dense index:
|
|
|
34
34
|
python -m pip install "embedflow[pinecone]"
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
+
For an existing Milvus collection:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
python -m pip install "embedflow[milvus]"
|
|
41
|
+
```
|
|
42
|
+
|
|
37
43
|
Qdrant and model-runtime extras are documented in the
|
|
38
44
|
[installation guide](https://github.com/arnsri33/embedflow/blob/main/docs/installation.md).
|
|
39
45
|
For model-backed analysis, install `embedflow[faiss,models,dashboard]`.
|
|
@@ -136,11 +142,13 @@ for definitions and reproduction details.
|
|
|
136
142
|
| Qdrant | Supported |
|
|
137
143
|
| pgvector | Supported |
|
|
138
144
|
| Pinecone | Supported |
|
|
145
|
+
| Milvus | Supported |
|
|
139
146
|
|
|
140
147
|
See the [FAISS guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/faiss.md),
|
|
141
148
|
[Qdrant guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/qdrant.md),
|
|
142
149
|
and [pgvector guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/pgvector.md),
|
|
143
|
-
and [Pinecone guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/pinecone.md)
|
|
150
|
+
and [Pinecone guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/pinecone.md),
|
|
151
|
+
and [Milvus guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/milvus.md).
|
|
144
152
|
|
|
145
153
|
## CLI
|
|
146
154
|
|
|
@@ -160,7 +168,7 @@ cover the remaining commands and endpoints.
|
|
|
160
168
|
|
|
161
169
|
## Status
|
|
162
170
|
|
|
163
|
-
EmbedFlow v0.
|
|
171
|
+
EmbedFlow v0.4.0 is an alpha release for research and early real-world
|
|
164
172
|
testing. T2-v1 is an empirical finite-tail diagnostic, partial rankings can
|
|
165
173
|
differ from fully warm target reranking, and ANN fidelity needs a reference
|
|
166
174
|
comparison to audit.
|
|
@@ -14,7 +14,7 @@ target:
|
|
|
14
14
|
device: cuda
|
|
15
15
|
|
|
16
16
|
index:
|
|
17
|
-
backend: faiss # faiss, qdrant, pgvector, or
|
|
17
|
+
backend: faiss # faiss, qdrant, pgvector, pinecone, or milvus
|
|
18
18
|
path: ./legacy.index
|
|
19
19
|
ids: ./legacy.index.ids.json # FAISS sidecar
|
|
20
20
|
metric: cosine
|
|
@@ -24,6 +24,8 @@ index:
|
|
|
24
24
|
# hnsw_ef_search, ivfflat_probes
|
|
25
25
|
# Pinecone fields: host (preferred) or index_name, api_key_env, namespace,
|
|
26
26
|
# text_metadata_field
|
|
27
|
+
# Milvus fields: uri, token_env, database, collection, id_field, vector_field,
|
|
28
|
+
# text_field, partition_names, search_params, auto_load
|
|
27
29
|
|
|
28
30
|
documents:
|
|
29
31
|
path: ./documents.jsonl
|
|
@@ -95,6 +97,15 @@ EMBEDFLOW_PINECONE_INDEX_NAME
|
|
|
95
97
|
EMBEDFLOW_PINECONE_NAMESPACE
|
|
96
98
|
EMBEDFLOW_PINECONE_TEXT_METADATA_FIELD
|
|
97
99
|
EMBEDFLOW_PINECONE_API_KEY_ENV
|
|
100
|
+
EMBEDFLOW_MILVUS_URI
|
|
101
|
+
EMBEDFLOW_MILVUS_TOKEN_ENV
|
|
102
|
+
EMBEDFLOW_MILVUS_DATABASE
|
|
103
|
+
EMBEDFLOW_MILVUS_COLLECTION
|
|
104
|
+
EMBEDFLOW_MILVUS_ID_FIELD
|
|
105
|
+
EMBEDFLOW_MILVUS_VECTOR_FIELD
|
|
106
|
+
EMBEDFLOW_MILVUS_TEXT_FIELD
|
|
107
|
+
EMBEDFLOW_MILVUS_PARTITIONS
|
|
108
|
+
EMBEDFLOW_MILVUS_AUTO_LOAD
|
|
98
109
|
EMBEDFLOW_INDEX_NPROBE
|
|
99
110
|
EMBEDFLOW_DOCUMENTS_PATH
|
|
100
111
|
EMBEDFLOW_CACHE_PATH
|
|
@@ -32,6 +32,7 @@ python -m pip install -e .
|
|
|
32
32
|
| `qdrant` | Qdrant client and adapter |
|
|
33
33
|
| `pgvector` | Psycopg 3 binary driver and pgvector adapter |
|
|
34
34
|
| `pinecone` | Official Pinecone Python SDK and adapter |
|
|
35
|
+
| `milvus` | Official pymilvus SDK and adapter |
|
|
35
36
|
| `models` | PyTorch, Transformers, Sentence Transformers, and Hub client |
|
|
36
37
|
| `dashboard` | FastAPI, Uvicorn, and Pydantic |
|
|
37
38
|
| `dev` | Pytest, Ruff, and build tooling |
|
|
@@ -66,6 +67,12 @@ Install the optional adapter with `python -m pip install "embedflow[pinecone]"`.
|
|
|
66
67
|
Set `PINECONE_API_KEY` in the environment and configure an existing dense
|
|
67
68
|
index host; see [`integrations/pinecone.md`](integrations/pinecone.md).
|
|
68
69
|
|
|
70
|
+
## Milvus
|
|
71
|
+
|
|
72
|
+
Install the optional adapter with `python -m pip install "embedflow[milvus]"`.
|
|
73
|
+
Configure an existing collection URI, database, and vector field; see
|
|
74
|
+
[`integrations/milvus.md`](integrations/milvus.md).
|
|
75
|
+
|
|
69
76
|
## CPU and GPU
|
|
70
77
|
|
|
71
78
|
The deterministic demo runs on CPU. Real model serving accepts `--device cpu`
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Milvus
|
|
2
|
+
|
|
3
|
+
EmbedFlow can use an existing Milvus collection as a read-only source
|
|
4
|
+
candidate index. A source query is executed by Milvus, the returned documents
|
|
5
|
+
are reranked by the target model, and target vectors are stored in EmbedFlow's
|
|
6
|
+
local cache. The adapter does not copy or rebuild the source collection.
|
|
7
|
+
|
|
8
|
+
## Install and connect
|
|
9
|
+
|
|
10
|
+
Install the optional official SDK (the adapter is tested with pymilvus 2.5.5
|
|
11
|
+
through 3.0.1):
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
python -m pip install "embedflow[milvus]"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
For a local standalone server, the URI is normally
|
|
18
|
+
`http://127.0.0.1:19530`. Cloud/Milvus-compatible endpoints can use the same
|
|
19
|
+
`MilvusClient` URI and token semantics. Keep credentials out of YAML:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
export EMBEDFLOW_MILVUS_TOKEN='user:password-or-cloud-token'
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
An unauthenticated local server may omit the variable. EmbedFlow never puts a
|
|
26
|
+
token in status, telemetry, generated configuration, or error messages.
|
|
27
|
+
|
|
28
|
+
Example configuration for a collection that stores its own text:
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
source:
|
|
32
|
+
model: sentence-transformers/all-MiniLM-L6-v2
|
|
33
|
+
dimension: 384
|
|
34
|
+
device: cuda
|
|
35
|
+
target:
|
|
36
|
+
model: Qwen/Qwen3-Embedding-0.6B
|
|
37
|
+
device: cuda
|
|
38
|
+
index:
|
|
39
|
+
backend: milvus
|
|
40
|
+
uri: http://127.0.0.1:19530
|
|
41
|
+
token_env: EMBEDFLOW_MILVUS_TOKEN
|
|
42
|
+
database: default
|
|
43
|
+
collection: documents
|
|
44
|
+
id_field: id
|
|
45
|
+
vector_field: embedding
|
|
46
|
+
text_field: content
|
|
47
|
+
metric: cosine
|
|
48
|
+
partition_names: []
|
|
49
|
+
auto_load: false
|
|
50
|
+
documents:
|
|
51
|
+
path: ./documents.jsonl
|
|
52
|
+
id_field: id
|
|
53
|
+
text_field: text
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`uri`, `database`, `collection`, `id_field`, `vector_field`, and
|
|
57
|
+
`text_field` are quoted as ordinary SDK arguments; they are not interpolated
|
|
58
|
+
into SQL. `vector_field` should identify a dense `FLOAT_VECTOR` field. The
|
|
59
|
+
first release does not claim support for `SPARSE_FLOAT_VECTOR`, `BINARY_VECTOR`,
|
|
60
|
+
`FLOAT16_VECTOR`, or `BFLOAT16_VECTOR`. If a collection has multiple dense
|
|
61
|
+
vector fields, configure `vector_field` explicitly.
|
|
62
|
+
|
|
63
|
+
## Text and IDs
|
|
64
|
+
|
|
65
|
+
There are two supported text layouts:
|
|
66
|
+
|
|
67
|
+
* Set `text_field` when the Milvus collection has `id`, `embedding`, and a
|
|
68
|
+
string text field. Search requests ask Milvus for only that field.
|
|
69
|
+
* Keep `text_field` unset and provide the normal EmbedFlow JSONL document
|
|
70
|
+
store. Candidate retrieval then asks Milvus for IDs only and resolves text
|
|
71
|
+
through the shared document-store contract.
|
|
72
|
+
|
|
73
|
+
Milvus `INT64` and `VARCHAR` primary keys are supported. IDs are exposed to
|
|
74
|
+
EmbedFlow as strings, so an INT64 value `42` is represented as `"42"` at the
|
|
75
|
+
application boundary while a VARCHAR value `"42"` remains a string. No numeric
|
|
76
|
+
coercion is performed for VARCHAR IDs.
|
|
77
|
+
|
|
78
|
+
## Metrics and indexes
|
|
79
|
+
|
|
80
|
+
Canonical metric names are `cosine`, `inner_product`/`dot`, and
|
|
81
|
+
`l2`/`euclidean`; they map to Milvus `COSINE`, `IP`, and `L2`. Milvus returns
|
|
82
|
+
COSINE/IP similarities (larger is better) and L2 distances (smaller is
|
|
83
|
+
better). EmbedFlow negates L2 distances only, preserving the shared
|
|
84
|
+
higher-is-better `SearchHit.score` convention.
|
|
85
|
+
|
|
86
|
+
The adapter does not create indexes. Existing HNSW and IVF_FLAT indexes are
|
|
87
|
+
queried when present. Optional native search parameters can be supplied as:
|
|
88
|
+
|
|
89
|
+
```yaml
|
|
90
|
+
index:
|
|
91
|
+
search_params:
|
|
92
|
+
ef: 64 # HNSW; raised to at least top-k when required by Milvus
|
|
93
|
+
# nprobe: 16 # IVF_FLAT
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Native Milvus form (`metric_type` plus `params`) is also accepted. Unknown
|
|
97
|
+
keys are rejected. `ef` is never sent below the requested top-k because HNSW
|
|
98
|
+
servers reject that request.
|
|
99
|
+
|
|
100
|
+
## Loading, databases, and partitions
|
|
101
|
+
|
|
102
|
+
EmbedFlow checks collection load state. `auto_load: false` (the conservative
|
|
103
|
+
default) returns an actionable error if the collection is not loaded. Set
|
|
104
|
+
`auto_load: true` only when explicitly permitting EmbedFlow to load this
|
|
105
|
+
collection; EmbedFlow never releases or unloads a collection.
|
|
106
|
+
|
|
107
|
+
`database` selects the Milvus database. `partition_names` restricts every
|
|
108
|
+
search and text lookup to the listed partitions. A missing partition fails at
|
|
109
|
+
connection time when the server exposes partition metadata. No arbitrary
|
|
110
|
+
Milvus filter expression is exposed because the shared `VectorIndex` contract
|
|
111
|
+
has no portable filter field.
|
|
112
|
+
|
|
113
|
+
## Commands and audit
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
embedflow doctor --config embedflow.yaml
|
|
117
|
+
embedflow audit-index --config embedflow.yaml
|
|
118
|
+
embedflow analyze --config embedflow.yaml --queries ./probe_queries.jsonl
|
|
119
|
+
embedflow serve --config embedflow.yaml --device cuda
|
|
120
|
+
embedflow search --config embedflow.yaml "your query"
|
|
121
|
+
embedflow status --config embedflow.yaml
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
`audit-index` reports URI (redacted), database, collection, fields, dense
|
|
125
|
+
vector type, dimension, metric, index type, load state, partitions, row
|
|
126
|
+
count, and a small retrieval/text probe. It intentionally keeps ANN fidelity,
|
|
127
|
+
T2-v1 compatibility, and candidate quality as separate `UNKNOWN`/empirical
|
|
128
|
+
questions; a reachable collection is not proof of migration compatibility.
|
|
129
|
+
|
|
130
|
+
Normal `doctor`, `audit-index`, `analyze`, `serve`, `search`, `status`, and
|
|
131
|
+
`prewarm` operations are read-only against the configured collection. Fixture
|
|
132
|
+
creation and inserts are confined to `scripts/milvus_fixture.py`, tests, and
|
|
133
|
+
the example setup.
|
|
134
|
+
|
|
135
|
+
## Local example
|
|
136
|
+
|
|
137
|
+
The repository includes a small standalone deployment and deterministic
|
|
138
|
+
fixture:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
cd examples/milvus
|
|
142
|
+
docker compose up -d
|
|
143
|
+
python -m pip install "embedflow[milvus,dashboard]"
|
|
144
|
+
./run_demo.sh
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
The fixture utility is deliberately explicit and refuses to overwrite an
|
|
148
|
+
existing collection. It can create HNSW, IVF_FLAT, or FLAT test indexes. No
|
|
149
|
+
model weights or credentials are committed.
|
|
150
|
+
|
|
151
|
+
## Troubleshooting and limitations
|
|
152
|
+
|
|
153
|
+
* `Milvus support requires ...`: install the `[milvus]` extra in the active
|
|
154
|
+
environment.
|
|
155
|
+
* `collection ... was not found`: check `uri`, `database`, and collection name.
|
|
156
|
+
* `collection ... is not loaded`: load it administratively or opt in to
|
|
157
|
+
`auto_load: true`.
|
|
158
|
+
* Dimension/metric errors mean the configured source model contract does not
|
|
159
|
+
match the existing vector field/index; EmbedFlow does not rewrite it.
|
|
160
|
+
* The adapter uses one synchronous `MilvusClient`; concurrent calls are
|
|
161
|
+
serialized by a lock. A pool is intentionally not introduced for this
|
|
162
|
+
release.
|
|
163
|
+
* Milvus-compatible URI/token semantics should work with Zilliz Cloud where
|
|
164
|
+
supported by the SDK, but Zilliz Cloud has not been independently validated
|
|
165
|
+
for this release.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Limitations and release scope
|
|
2
2
|
|
|
3
|
-
EmbedFlow v0.
|
|
3
|
+
EmbedFlow v0.4.0 is an alpha release for research and early real-world
|
|
4
4
|
testing. The serving path is designed to make migration experiments concrete;
|
|
5
5
|
production rollout still requires application-specific validation.
|
|
6
6
|
|
|
@@ -18,8 +18,8 @@ python -m twine check dist/*
|
|
|
18
18
|
Inspect both archives before uploading:
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
unzip -l dist/embedflow-0.
|
|
22
|
-
tar -tzf dist/embedflow-0.
|
|
21
|
+
unzip -l dist/embedflow-0.4.0-py3-none-any.whl
|
|
22
|
+
tar -tzf dist/embedflow-0.4.0.tar.gz
|
|
23
23
|
sha256sum dist/*
|
|
24
24
|
```
|
|
25
25
|
|
|
@@ -32,7 +32,7 @@ Test the wheel outside the source tree:
|
|
|
32
32
|
```bash
|
|
33
33
|
python -m venv /tmp/embedflow-wheel-test
|
|
34
34
|
/tmp/embedflow-wheel-test/bin/python -m pip install --upgrade pip
|
|
35
|
-
/tmp/embedflow-wheel-test/bin/python -m pip install dist/embedflow-0.
|
|
35
|
+
/tmp/embedflow-wheel-test/bin/python -m pip install dist/embedflow-0.4.0-py3-none-any.whl
|
|
36
36
|
cd /tmp
|
|
37
37
|
/tmp/embedflow-wheel-test/bin/python -c "import embedflow; print(embedflow.__version__)"
|
|
38
38
|
/tmp/embedflow-wheel-test/bin/embedflow --help
|
|
@@ -65,7 +65,7 @@ python -m venv /tmp/embedflow-testpypi
|
|
|
65
65
|
/tmp/embedflow-testpypi/bin/python -m pip install \
|
|
66
66
|
--index-url https://test.pypi.org/simple/ \
|
|
67
67
|
--extra-index-url https://pypi.org/simple/ \
|
|
68
|
-
embedflow==0.
|
|
68
|
+
embedflow==0.4.0
|
|
69
69
|
cd /tmp
|
|
70
70
|
/tmp/embedflow-testpypi/bin/python -c "import embedflow; print(embedflow.__version__)"
|
|
71
71
|
/tmp/embedflow-testpypi/bin/embedflow --help
|
|
@@ -79,11 +79,11 @@ Test optional integrations in a second clean environment:
|
|
|
79
79
|
/tmp/embedflow-testpypi/bin/python -m pip install \
|
|
80
80
|
--index-url https://test.pypi.org/simple/ \
|
|
81
81
|
--extra-index-url https://pypi.org/simple/ \
|
|
82
|
-
"embedflow[faiss,dashboard,pinecone]==0.
|
|
82
|
+
"embedflow[faiss,dashboard,pinecone,milvus]==0.4.0"
|
|
83
83
|
```
|
|
84
84
|
|
|
85
85
|
If the same filename already exists on TestPyPI, use a pre-release such as
|
|
86
|
-
`0.
|
|
86
|
+
`0.4.0rc1` for the TestPyPI-only trial. Keep production `0.4.0` unchanged.
|
|
87
87
|
|
|
88
88
|
## Trusted Publishing configuration
|
|
89
89
|
|
|
@@ -115,7 +115,7 @@ above keeps the test step explicit.
|
|
|
115
115
|
3. Run the final release gate and review the generated report.
|
|
116
116
|
4. Configure the PyPI pending publisher and protected `pypi` environment.
|
|
117
117
|
5. Create a Git tag and GitHub Release for the exact package version, for
|
|
118
|
-
example `v0.
|
|
118
|
+
example `v0.4.0`.
|
|
119
119
|
6. Approve the `pypi` environment when the release workflow is ready.
|
|
120
120
|
7. Verify the files and metadata on PyPI.
|
|
121
121
|
8. Install from production PyPI in a directory outside this checkout.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"""EmbedFlow: progressive embedding-model migration for existing indexes."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.
|
|
3
|
+
__version__ = "0.4.0"
|
|
4
4
|
|
|
5
5
|
from .config import EmbedFlowConfig, load_config
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
def migrate(*args, **kwargs):
|
|
9
|
-
"""Start progressive migration over an existing FAISS, Qdrant, pgvector, or
|
|
9
|
+
"""Start progressive migration over an existing FAISS, Qdrant, pgvector, Pinecone, or Milvus index.
|
|
10
10
|
|
|
11
11
|
Imported lazily to keep the lightweight configuration package free of
|
|
12
12
|
model-serving dependencies at import time. See ``embedflow.migration``
|