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.
Files changed (140) hide show
  1. {embedflow-0.3.0 → embedflow-0.4.0}/CHANGELOG.md +9 -0
  2. {embedflow-0.3.0 → embedflow-0.4.0}/CITATION.cff +1 -1
  3. {embedflow-0.3.0 → embedflow-0.4.0}/MANIFEST.in +1 -1
  4. {embedflow-0.3.0 → embedflow-0.4.0}/PKG-INFO +16 -5
  5. {embedflow-0.3.0 → embedflow-0.4.0}/README.md +10 -2
  6. {embedflow-0.3.0 → embedflow-0.4.0}/README_PYPI.md +11 -3
  7. {embedflow-0.3.0 → embedflow-0.4.0}/docs/configuration.md +12 -1
  8. {embedflow-0.3.0 → embedflow-0.4.0}/docs/installation.md +7 -0
  9. embedflow-0.4.0/docs/integrations/milvus.md +165 -0
  10. {embedflow-0.3.0 → embedflow-0.4.0}/docs/limitations.md +1 -1
  11. {embedflow-0.3.0 → embedflow-0.4.0}/docs/releasing.md +7 -7
  12. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/__init__.py +2 -2
  13. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/cli.py +90 -23
  14. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/evaluate.py +3 -0
  15. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/config.py +109 -6
  16. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/indexes/__init__.py +2 -0
  17. embedflow-0.4.0/embedflow/indexes/milvus_backend.py +1056 -0
  18. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/migration/facade.py +43 -9
  19. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/runtime.py +17 -4
  20. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow.egg-info/PKG-INFO +16 -5
  21. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow.egg-info/SOURCES.txt +9 -0
  22. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow.egg-info/requires.txt +4 -0
  23. embedflow-0.4.0/examples/milvus/README.md +39 -0
  24. embedflow-0.4.0/examples/milvus/compose.yaml +48 -0
  25. embedflow-0.4.0/examples/milvus/embedflow.yaml.example +26 -0
  26. embedflow-0.4.0/examples/milvus/run_demo.sh +15 -0
  27. embedflow-0.4.0/examples/pinecone/embedflow.yaml.example +35 -0
  28. {embedflow-0.3.0 → embedflow-0.4.0}/pyproject.toml +4 -2
  29. embedflow-0.4.0/scripts/milvus_fixture.py +102 -0
  30. {embedflow-0.3.0 → embedflow-0.4.0}/scripts/release_gate.py +17 -2
  31. embedflow-0.4.0/scripts/validate_milvus.py +356 -0
  32. {embedflow-0.3.0 → embedflow-0.4.0}/scripts/validate_pgvector_10k.py +2 -2
  33. {embedflow-0.3.0 → embedflow-0.4.0}/CONTRIBUTING.md +0 -0
  34. {embedflow-0.3.0 → embedflow-0.4.0}/LICENSE +0 -0
  35. {embedflow-0.3.0 → embedflow-0.4.0}/SECURITY.md +0 -0
  36. {embedflow-0.3.0 → embedflow-0.4.0}/docs/api.md +0 -0
  37. {embedflow-0.3.0 → embedflow-0.4.0}/docs/assets/README.md +0 -0
  38. {embedflow-0.3.0 → embedflow-0.4.0}/docs/assets/candidate-gap-example.svg +0 -0
  39. {embedflow-0.3.0 → embedflow-0.4.0}/docs/assets/dashboard-screenshot.md +0 -0
  40. {embedflow-0.3.0 → embedflow-0.4.0}/docs/assets/terminal-demo.txt +0 -0
  41. {embedflow-0.3.0 → embedflow-0.4.0}/docs/cli.md +0 -0
  42. {embedflow-0.3.0 → embedflow-0.4.0}/docs/concepts.md +0 -0
  43. {embedflow-0.3.0 → embedflow-0.4.0}/docs/contributing-benchmarks.md +0 -0
  44. {embedflow-0.3.0 → embedflow-0.4.0}/docs/economics.md +0 -0
  45. {embedflow-0.3.0 → embedflow-0.4.0}/docs/integrations/faiss.md +0 -0
  46. {embedflow-0.3.0 → embedflow-0.4.0}/docs/integrations/pgvector.md +0 -0
  47. {embedflow-0.3.0 → embedflow-0.4.0}/docs/integrations/pinecone.md +0 -0
  48. {embedflow-0.3.0 → embedflow-0.4.0}/docs/integrations/qdrant.md +0 -0
  49. {embedflow-0.3.0 → embedflow-0.4.0}/docs/methodology.md +0 -0
  50. {embedflow-0.3.0 → embedflow-0.4.0}/docs/quickstart.md +0 -0
  51. {embedflow-0.3.0 → embedflow-0.4.0}/docs/registry.md +0 -0
  52. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/__main__.py +0 -0
  53. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/analysis.py +0 -0
  54. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/api.py +0 -0
  55. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/cache/__init__.py +0 -0
  56. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/cache/base.py +0 -0
  57. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/cache/persistent_cache.py +0 -0
  58. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/__init__.py +0 -0
  59. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/candidate_gap.py +0 -0
  60. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/containment.py +0 -0
  61. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/metrics.py +0 -0
  62. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/migration_depth.py +0 -0
  63. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/probe.py +0 -0
  64. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/report.py +0 -0
  65. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/compatibility/t2.py +0 -0
  66. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/__init__.py +0 -0
  67. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/__init__.py +0 -0
  68. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/benchmark_profiles.jsonl +0 -0
  69. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/checksums.sha256 +0 -0
  70. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/migrations.jsonl +0 -0
  71. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/registry_manifest.json +0 -0
  72. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/research_summaries.json +0 -0
  73. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/data/registry/schema_version.json +0 -0
  74. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/frozen/T2_V1_FROZEN_SPEC.md +0 -0
  75. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/frozen/T2_V1_FROZEN_SPEC.sha256 +0 -0
  76. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/indexes/base.py +0 -0
  77. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/indexes/faiss_backend.py +0 -0
  78. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/indexes/pgvector_backend.py +0 -0
  79. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/indexes/pinecone_backend.py +0 -0
  80. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/indexes/qdrant_backend.py +0 -0
  81. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/metrics/__init__.py +0 -0
  82. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/metrics/latency.py +0 -0
  83. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/migration/__init__.py +0 -0
  84. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/migration/compatibility.py +0 -0
  85. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/migration/materializer.py +0 -0
  86. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/migration/planner.py +0 -0
  87. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/migration/state.py +0 -0
  88. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/models/__init__.py +0 -0
  89. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/models/base.py +0 -0
  90. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/models/huggingface.py +0 -0
  91. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/registry/__init__.py +0 -0
  92. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/registry/loader.py +0 -0
  93. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/registry/matcher.py +0 -0
  94. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/registry/schema.py +0 -0
  95. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/serving/__init__.py +0 -0
  96. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/serving/api.py +0 -0
  97. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/serving/engine.py +0 -0
  98. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/serving/factory.py +0 -0
  99. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow/serving/schemas.py +0 -0
  100. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow.egg-info/dependency_links.txt +0 -0
  101. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow.egg-info/entry_points.txt +0 -0
  102. {embedflow-0.3.0 → embedflow-0.4.0}/embedflow.egg-info/top_level.txt +0 -0
  103. {embedflow-0.3.0 → embedflow-0.4.0}/examples/faiss/README.md +0 -0
  104. {embedflow-0.3.0 → embedflow-0.4.0}/examples/faiss/documents.jsonl +0 -0
  105. {embedflow-0.3.0 → embedflow-0.4.0}/examples/faiss/embedflow.yaml +0 -0
  106. {embedflow-0.3.0 → embedflow-0.4.0}/examples/faiss/queries.jsonl +0 -0
  107. {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/README.md +0 -0
  108. {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/build_index.py +0 -0
  109. {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/compose.yaml +0 -0
  110. {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/embedflow.yaml +0 -0
  111. {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/init.sql +0 -0
  112. {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/queries.jsonl +0 -0
  113. {embedflow-0.3.0 → embedflow-0.4.0}/examples/pgvector/run_demo.sh +0 -0
  114. {embedflow-0.3.0 → embedflow-0.4.0}/examples/pinecone/README.md +0 -0
  115. {embedflow-0.3.0 → embedflow-0.4.0}/examples/pinecone/run_smoke.sh +0 -0
  116. {embedflow-0.3.0 → embedflow-0.4.0}/examples/qdrant/README.md +0 -0
  117. {embedflow-0.3.0 → embedflow-0.4.0}/examples/qdrant/build_index.py +0 -0
  118. {embedflow-0.3.0 → embedflow-0.4.0}/examples/qdrant/documents.jsonl +0 -0
  119. {embedflow-0.3.0 → embedflow-0.4.0}/examples/qdrant/embedflow.yaml +0 -0
  120. {embedflow-0.3.0 → embedflow-0.4.0}/examples/qdrant/queries.jsonl +0 -0
  121. {embedflow-0.3.0 → embedflow-0.4.0}/examples/research_analysis/README.md +0 -0
  122. {embedflow-0.3.0 → embedflow-0.4.0}/examples/research_analysis/documents.jsonl +0 -0
  123. {embedflow-0.3.0 → embedflow-0.4.0}/examples/research_analysis/embedflow.yaml +0 -0
  124. {embedflow-0.3.0 → embedflow-0.4.0}/examples/research_analysis/qrels.json +0 -0
  125. {embedflow-0.3.0 → embedflow-0.4.0}/examples/research_analysis/queries.jsonl +0 -0
  126. {embedflow-0.3.0 → embedflow-0.4.0}/frozen/T2_V1_FROZEN_SPEC.md +0 -0
  127. {embedflow-0.3.0 → embedflow-0.4.0}/frozen/T2_V1_FROZEN_SPEC.sha256 +0 -0
  128. {embedflow-0.3.0 → embedflow-0.4.0}/requirements-dev.txt +0 -0
  129. {embedflow-0.3.0 → embedflow-0.4.0}/requirements.txt +0 -0
  130. {embedflow-0.3.0 → embedflow-0.4.0}/scripts/pinecone_smoke.py +0 -0
  131. {embedflow-0.3.0 → embedflow-0.4.0}/scripts/real_qdrant_smoke.py +0 -0
  132. {embedflow-0.3.0 → embedflow-0.4.0}/scripts/run_demo.sh +0 -0
  133. {embedflow-0.3.0 → embedflow-0.4.0}/scripts/run_tests.sh +0 -0
  134. {embedflow-0.3.0 → embedflow-0.4.0}/setup.cfg +0 -0
  135. {embedflow-0.3.0 → embedflow-0.4.0}/src/__init__.py +0 -0
  136. {embedflow-0.3.0 → embedflow-0.4.0}/src/embed.py +0 -0
  137. {embedflow-0.3.0 → embedflow-0.4.0}/src/probe_features.py +0 -0
  138. {embedflow-0.3.0 → embedflow-0.4.0}/src/storage.py +0 -0
  139. {embedflow-0.3.0 → embedflow-0.4.0}/src/t2_v1.py +0 -0
  140. {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.3.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.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.3.0 is an alpha release for research and early real-world
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.3.0 is an alpha release for research and early real-world
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.3.0 is an alpha release for research and early real-world
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 pinecone
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.0 is an alpha release for research and early real-world
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.3.0-py3-none-any.whl
22
- tar -tzf dist/embedflow-0.3.0.tar.gz
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.3.0-py3-none-any.whl
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.3.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.3.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.3.0rc1` for the TestPyPI-only trial. Keep production `0.3.0` unchanged.
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.3.0`.
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.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 Pinecone index.
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``