embedflow 0.2.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.2.0 → embedflow-0.4.0}/CHANGELOG.md +17 -0
  2. {embedflow-0.2.0 → embedflow-0.4.0}/CITATION.cff +1 -1
  3. {embedflow-0.2.0 → embedflow-0.4.0}/CONTRIBUTING.md +1 -1
  4. {embedflow-0.2.0 → embedflow-0.4.0}/MANIFEST.in +1 -1
  5. {embedflow-0.2.0 → embedflow-0.4.0}/PKG-INFO +27 -5
  6. {embedflow-0.2.0 → embedflow-0.4.0}/README.md +18 -2
  7. {embedflow-0.2.0 → embedflow-0.4.0}/README_PYPI.md +19 -3
  8. {embedflow-0.2.0 → embedflow-0.4.0}/docs/api.md +3 -1
  9. {embedflow-0.2.0 → embedflow-0.4.0}/docs/configuration.md +19 -1
  10. {embedflow-0.2.0 → embedflow-0.4.0}/docs/installation.md +14 -0
  11. embedflow-0.4.0/docs/integrations/milvus.md +165 -0
  12. embedflow-0.4.0/docs/integrations/pinecone.md +157 -0
  13. {embedflow-0.2.0 → embedflow-0.4.0}/docs/limitations.md +1 -1
  14. {embedflow-0.2.0 → embedflow-0.4.0}/docs/releasing.md +7 -7
  15. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/__init__.py +2 -2
  16. embedflow-0.4.0/embedflow/api.py +10 -0
  17. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/cli.py +172 -35
  18. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/evaluate.py +3 -0
  19. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/config.py +152 -8
  20. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/indexes/__init__.py +4 -0
  21. embedflow-0.4.0/embedflow/indexes/milvus_backend.py +1056 -0
  22. embedflow-0.4.0/embedflow/indexes/pinecone_backend.py +764 -0
  23. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/migration/facade.py +76 -15
  24. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/runtime.py +39 -6
  25. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow.egg-info/PKG-INFO +27 -5
  26. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow.egg-info/SOURCES.txt +15 -0
  27. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow.egg-info/requires.txt +8 -0
  28. embedflow-0.4.0/examples/milvus/README.md +39 -0
  29. embedflow-0.4.0/examples/milvus/compose.yaml +48 -0
  30. embedflow-0.4.0/examples/milvus/embedflow.yaml.example +26 -0
  31. embedflow-0.4.0/examples/milvus/run_demo.sh +15 -0
  32. embedflow-0.4.0/examples/pinecone/README.md +32 -0
  33. embedflow-0.4.0/examples/pinecone/embedflow.yaml.example +35 -0
  34. embedflow-0.4.0/examples/pinecone/run_smoke.sh +8 -0
  35. {embedflow-0.2.0 → embedflow-0.4.0}/pyproject.toml +6 -2
  36. embedflow-0.4.0/scripts/milvus_fixture.py +102 -0
  37. embedflow-0.4.0/scripts/pinecone_smoke.py +54 -0
  38. {embedflow-0.2.0 → embedflow-0.4.0}/scripts/release_gate.py +24 -4
  39. embedflow-0.4.0/scripts/validate_milvus.py +356 -0
  40. {embedflow-0.2.0 → embedflow-0.4.0}/scripts/validate_pgvector_10k.py +2 -2
  41. {embedflow-0.2.0 → embedflow-0.4.0}/LICENSE +0 -0
  42. {embedflow-0.2.0 → embedflow-0.4.0}/SECURITY.md +0 -0
  43. {embedflow-0.2.0 → embedflow-0.4.0}/docs/assets/README.md +0 -0
  44. {embedflow-0.2.0 → embedflow-0.4.0}/docs/assets/candidate-gap-example.svg +0 -0
  45. {embedflow-0.2.0 → embedflow-0.4.0}/docs/assets/dashboard-screenshot.md +0 -0
  46. {embedflow-0.2.0 → embedflow-0.4.0}/docs/assets/terminal-demo.txt +0 -0
  47. {embedflow-0.2.0 → embedflow-0.4.0}/docs/cli.md +0 -0
  48. {embedflow-0.2.0 → embedflow-0.4.0}/docs/concepts.md +0 -0
  49. {embedflow-0.2.0 → embedflow-0.4.0}/docs/contributing-benchmarks.md +0 -0
  50. {embedflow-0.2.0 → embedflow-0.4.0}/docs/economics.md +0 -0
  51. {embedflow-0.2.0 → embedflow-0.4.0}/docs/integrations/faiss.md +0 -0
  52. {embedflow-0.2.0 → embedflow-0.4.0}/docs/integrations/pgvector.md +0 -0
  53. {embedflow-0.2.0 → embedflow-0.4.0}/docs/integrations/qdrant.md +0 -0
  54. {embedflow-0.2.0 → embedflow-0.4.0}/docs/methodology.md +0 -0
  55. {embedflow-0.2.0 → embedflow-0.4.0}/docs/quickstart.md +0 -0
  56. {embedflow-0.2.0 → embedflow-0.4.0}/docs/registry.md +0 -0
  57. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/__main__.py +0 -0
  58. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/analysis.py +0 -0
  59. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/cache/__init__.py +0 -0
  60. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/cache/base.py +0 -0
  61. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/cache/persistent_cache.py +0 -0
  62. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/__init__.py +0 -0
  63. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/candidate_gap.py +0 -0
  64. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/containment.py +0 -0
  65. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/metrics.py +0 -0
  66. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/migration_depth.py +0 -0
  67. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/probe.py +0 -0
  68. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/report.py +0 -0
  69. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/t2.py +0 -0
  70. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/__init__.py +0 -0
  71. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/__init__.py +0 -0
  72. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/benchmark_profiles.jsonl +0 -0
  73. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/checksums.sha256 +0 -0
  74. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/migrations.jsonl +0 -0
  75. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/registry_manifest.json +0 -0
  76. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/research_summaries.json +0 -0
  77. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/schema_version.json +0 -0
  78. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/frozen/T2_V1_FROZEN_SPEC.md +0 -0
  79. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/frozen/T2_V1_FROZEN_SPEC.sha256 +0 -0
  80. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/indexes/base.py +0 -0
  81. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/indexes/faiss_backend.py +0 -0
  82. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/indexes/pgvector_backend.py +0 -0
  83. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/indexes/qdrant_backend.py +0 -0
  84. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/metrics/__init__.py +0 -0
  85. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/metrics/latency.py +0 -0
  86. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/migration/__init__.py +0 -0
  87. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/migration/compatibility.py +0 -0
  88. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/migration/materializer.py +0 -0
  89. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/migration/planner.py +0 -0
  90. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/migration/state.py +0 -0
  91. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/models/__init__.py +0 -0
  92. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/models/base.py +0 -0
  93. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/models/huggingface.py +0 -0
  94. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/registry/__init__.py +0 -0
  95. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/registry/loader.py +0 -0
  96. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/registry/matcher.py +0 -0
  97. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/registry/schema.py +0 -0
  98. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/serving/__init__.py +0 -0
  99. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/serving/api.py +0 -0
  100. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/serving/engine.py +0 -0
  101. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/serving/factory.py +0 -0
  102. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/serving/schemas.py +0 -0
  103. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow.egg-info/dependency_links.txt +0 -0
  104. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow.egg-info/entry_points.txt +0 -0
  105. {embedflow-0.2.0 → embedflow-0.4.0}/embedflow.egg-info/top_level.txt +0 -0
  106. {embedflow-0.2.0 → embedflow-0.4.0}/examples/faiss/README.md +0 -0
  107. {embedflow-0.2.0 → embedflow-0.4.0}/examples/faiss/documents.jsonl +0 -0
  108. {embedflow-0.2.0 → embedflow-0.4.0}/examples/faiss/embedflow.yaml +0 -0
  109. {embedflow-0.2.0 → embedflow-0.4.0}/examples/faiss/queries.jsonl +0 -0
  110. {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/README.md +0 -0
  111. {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/build_index.py +0 -0
  112. {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/compose.yaml +0 -0
  113. {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/embedflow.yaml +0 -0
  114. {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/init.sql +0 -0
  115. {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/queries.jsonl +0 -0
  116. {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/run_demo.sh +0 -0
  117. {embedflow-0.2.0 → embedflow-0.4.0}/examples/qdrant/README.md +0 -0
  118. {embedflow-0.2.0 → embedflow-0.4.0}/examples/qdrant/build_index.py +0 -0
  119. {embedflow-0.2.0 → embedflow-0.4.0}/examples/qdrant/documents.jsonl +0 -0
  120. {embedflow-0.2.0 → embedflow-0.4.0}/examples/qdrant/embedflow.yaml +0 -0
  121. {embedflow-0.2.0 → embedflow-0.4.0}/examples/qdrant/queries.jsonl +0 -0
  122. {embedflow-0.2.0 → embedflow-0.4.0}/examples/research_analysis/README.md +0 -0
  123. {embedflow-0.2.0 → embedflow-0.4.0}/examples/research_analysis/documents.jsonl +0 -0
  124. {embedflow-0.2.0 → embedflow-0.4.0}/examples/research_analysis/embedflow.yaml +0 -0
  125. {embedflow-0.2.0 → embedflow-0.4.0}/examples/research_analysis/qrels.json +0 -0
  126. {embedflow-0.2.0 → embedflow-0.4.0}/examples/research_analysis/queries.jsonl +0 -0
  127. {embedflow-0.2.0 → embedflow-0.4.0}/frozen/T2_V1_FROZEN_SPEC.md +0 -0
  128. {embedflow-0.2.0 → embedflow-0.4.0}/frozen/T2_V1_FROZEN_SPEC.sha256 +0 -0
  129. {embedflow-0.2.0 → embedflow-0.4.0}/requirements-dev.txt +0 -0
  130. {embedflow-0.2.0 → embedflow-0.4.0}/requirements.txt +0 -0
  131. {embedflow-0.2.0 → embedflow-0.4.0}/scripts/real_qdrant_smoke.py +0 -0
  132. {embedflow-0.2.0 → embedflow-0.4.0}/scripts/run_demo.sh +0 -0
  133. {embedflow-0.2.0 → embedflow-0.4.0}/scripts/run_tests.sh +0 -0
  134. {embedflow-0.2.0 → embedflow-0.4.0}/setup.cfg +0 -0
  135. {embedflow-0.2.0 → embedflow-0.4.0}/src/__init__.py +0 -0
  136. {embedflow-0.2.0 → embedflow-0.4.0}/src/embed.py +0 -0
  137. {embedflow-0.2.0 → embedflow-0.4.0}/src/probe_features.py +0 -0
  138. {embedflow-0.2.0 → embedflow-0.4.0}/src/storage.py +0 -0
  139. {embedflow-0.2.0 → embedflow-0.4.0}/src/t2_v1.py +0 -0
  140. {embedflow-0.2.0 → embedflow-0.4.0}/src/utils.py +0 -0
@@ -1,5 +1,22 @@
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
+
12
+ ## v0.3.0 — Pinecone backend
13
+
14
+ - Added a read-only Pinecone backend for existing dense indexes.
15
+ - Added host targeting, index-name resolution, namespace-aware retrieval, and
16
+ metadata or external-document text resolution.
17
+ - Added Pinecone status/audit integration, optional dependency packaging, and
18
+ unit/integration smoke fixtures.
19
+
3
20
  ## v0.2.0 — pgvector backend
4
21
 
5
22
  - Added a read-only pgvector backend for existing PostgreSQL vector tables.
@@ -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.2.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"
@@ -11,7 +11,7 @@ python -m pip install -e '.[dev]'
11
11
  ```
12
12
 
13
13
  Optional integrations can be installed with `.[faiss]`, `.[qdrant]`,
14
- `.[models]`, or `.[dashboard]`.
14
+ `.[pgvector]`, `.[pinecone]`, `.[models]`, or `.[dashboard]`.
15
15
 
16
16
  ## Checks before opening a pull request
17
17
 
@@ -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.2.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
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
@@ -29,6 +29,10 @@ Provides-Extra: qdrant
29
29
  Requires-Dist: qdrant-client>=1.9; extra == "qdrant"
30
30
  Provides-Extra: pgvector
31
31
  Requires-Dist: psycopg[binary]>=3.2; extra == "pgvector"
32
+ Provides-Extra: pinecone
33
+ Requires-Dist: pinecone>=6.0; extra == "pinecone"
34
+ Provides-Extra: milvus
35
+ Requires-Dist: pymilvus<4,>=2.5.5; extra == "milvus"
32
36
  Provides-Extra: models
33
37
  Requires-Dist: huggingface-hub<1.0,>=0.34; extra == "models"
34
38
  Requires-Dist: transformers<5.0,>=4.45; extra == "models"
@@ -42,6 +46,8 @@ Provides-Extra: all
42
46
  Requires-Dist: faiss-cpu>=1.8.0; extra == "all"
43
47
  Requires-Dist: qdrant-client>=1.9; extra == "all"
44
48
  Requires-Dist: psycopg[binary]>=3.2; extra == "all"
49
+ Requires-Dist: pinecone>=6.0; extra == "all"
50
+ Requires-Dist: pymilvus<4,>=2.5.5; extra == "all"
45
51
  Requires-Dist: huggingface-hub<1.0,>=0.34; extra == "all"
46
52
  Requires-Dist: transformers<5.0,>=4.45; extra == "all"
47
53
  Requires-Dist: sentence-transformers>=3.0; extra == "all"
@@ -62,7 +68,7 @@ Dynamic: license-file
62
68
  EmbedFlow lets a new embedding model serve over candidates from an existing
63
69
  vector index while target document vectors are materialized progressively. It
64
70
  supports migration analysis, persistent caching, background work, FAISS,
65
- Qdrant, pgvector, a CLI, and FastAPI.
71
+ Qdrant, pgvector, Pinecone, Milvus, a CLI, and FastAPI.
66
72
 
67
73
  The full project README and architecture diagram are on
68
74
  <https://github.com/arnsri33/embedflow>.
@@ -85,6 +91,18 @@ For an existing PostgreSQL/pgvector table:
85
91
  python -m pip install "embedflow[pgvector]"
86
92
  ```
87
93
 
94
+ For an existing Pinecone dense index:
95
+
96
+ ```bash
97
+ python -m pip install "embedflow[pinecone]"
98
+ ```
99
+
100
+ For an existing Milvus collection:
101
+
102
+ ```bash
103
+ python -m pip install "embedflow[milvus]"
104
+ ```
105
+
88
106
  Qdrant and model-runtime extras are documented in the
89
107
  [installation guide](https://github.com/arnsri33/embedflow/blob/main/docs/installation.md).
90
108
  For model-backed analysis, install `embedflow[faiss,models,dashboard]`.
@@ -186,10 +204,14 @@ for definitions and reproduction details.
186
204
  | FAISS | Supported |
187
205
  | Qdrant | Supported |
188
206
  | pgvector | Supported |
207
+ | Pinecone | Supported |
208
+ | Milvus | Supported |
189
209
 
190
210
  See the [FAISS guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/faiss.md),
191
211
  [Qdrant guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/qdrant.md),
192
- and [pgvector guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/pgvector.md).
212
+ and [pgvector guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/pgvector.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).
193
215
 
194
216
  ## CLI
195
217
 
@@ -209,7 +231,7 @@ cover the remaining commands and endpoints.
209
231
 
210
232
  ## Status
211
233
 
212
- EmbedFlow v0.2.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
213
235
  testing. T2-v1 is an empirical finite-tail diagnostic, partial rankings can
214
236
  differ from fully warm target reranking, and ANN fidelity needs a reference
215
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, 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
 
@@ -52,6 +52,18 @@ For FAISS and the dashboard, add the optional integrations:
52
52
  python -m pip install "embedflow[faiss,dashboard]"
53
53
  ```
54
54
 
55
+ For an existing Pinecone dense index:
56
+
57
+ ```bash
58
+ python -m pip install "embedflow[pinecone]"
59
+ ```
60
+
61
+ For an existing Milvus collection:
62
+
63
+ ```bash
64
+ python -m pip install "embedflow[milvus]"
65
+ ```
66
+
55
67
  Qdrant and model-runtime extras are documented in
56
68
  [`docs/installation.md`](https://github.com/arnsri33/embedflow/blob/main/docs/installation.md).
57
69
  For model-backed analysis, install `embedflow[faiss,models,dashboard]`.
@@ -190,12 +202,16 @@ is measured separately and is `UNKNOWN` until an exact reference is supplied.
190
202
  | FAISS | Supported |
191
203
  | Qdrant | Supported |
192
204
  | pgvector | Supported |
205
+ | Pinecone | Supported |
206
+ | Milvus | Supported |
193
207
 
194
208
  Backend-specific setup and examples:
195
209
 
196
210
  - [FAISS](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/faiss.md)
197
211
  - [Qdrant](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/qdrant.md)
198
212
  - [pgvector](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/pgvector.md)
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)
199
215
  - [Adding a backend](https://github.com/arnsri33/embedflow/blob/main/CONTRIBUTING.md)
200
216
 
201
217
  ## CLI
@@ -230,7 +246,7 @@ OpenAPI documentation; see
230
246
 
231
247
  ## Status
232
248
 
233
- EmbedFlow v0.2.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
234
250
  testing.
235
251
 
236
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, 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>.
@@ -28,6 +28,18 @@ For an existing PostgreSQL/pgvector table:
28
28
  python -m pip install "embedflow[pgvector]"
29
29
  ```
30
30
 
31
+ For an existing Pinecone dense index:
32
+
33
+ ```bash
34
+ python -m pip install "embedflow[pinecone]"
35
+ ```
36
+
37
+ For an existing Milvus collection:
38
+
39
+ ```bash
40
+ python -m pip install "embedflow[milvus]"
41
+ ```
42
+
31
43
  Qdrant and model-runtime extras are documented in the
32
44
  [installation guide](https://github.com/arnsri33/embedflow/blob/main/docs/installation.md).
33
45
  For model-backed analysis, install `embedflow[faiss,models,dashboard]`.
@@ -129,10 +141,14 @@ for definitions and reproduction details.
129
141
  | FAISS | Supported |
130
142
  | Qdrant | Supported |
131
143
  | pgvector | Supported |
144
+ | Pinecone | Supported |
145
+ | Milvus | Supported |
132
146
 
133
147
  See the [FAISS guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/faiss.md),
134
148
  [Qdrant guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/qdrant.md),
135
- and [pgvector guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/pgvector.md).
149
+ and [pgvector guide](https://github.com/arnsri33/embedflow/blob/main/docs/integrations/pgvector.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).
136
152
 
137
153
  ## CLI
138
154
 
@@ -152,7 +168,7 @@ cover the remaining commands and endpoints.
152
168
 
153
169
  ## Status
154
170
 
155
- EmbedFlow v0.2.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
156
172
  testing. T2-v1 is an empirical finite-tail diagnostic, partial rankings can
157
173
  differ from fully warm target reranking, and ANN fidelity needs a reference
158
174
  comparison to audit.
@@ -49,7 +49,9 @@ request. A partial response scores the available target vectors; it can differ
49
49
  from the fully warm ranking.
50
50
 
51
51
  `/status` includes safe backend metadata. For pgvector this names the
52
- schema/table and vector contract without returning the DSN or credentials;
52
+ schema/table and vector contract; for Pinecone it names the host/index,
53
+ namespace, dimension, metric, and safe vector counts. Neither backend returns
54
+ the DSN, API key, or credentials;
53
55
  `/health` remains a compact liveness response for probes and load balancers.
54
56
 
55
57
  ## Errors
@@ -14,7 +14,7 @@ target:
14
14
  device: cuda
15
15
 
16
16
  index:
17
- backend: faiss # faiss, qdrant, or pgvector
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
@@ -22,6 +22,10 @@ index:
22
22
  # Qdrant fields: url, collection, vector_name, api_key_env
23
23
  # pgvector fields: dsn_env, schema, table, id_column, vector_column, text_column
24
24
  # hnsw_ef_search, ivfflat_probes
25
+ # Pinecone fields: host (preferred) or index_name, api_key_env, namespace,
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
25
29
 
26
30
  documents:
27
31
  path: ./documents.jsonl
@@ -88,6 +92,20 @@ EMBEDFLOW_PGVECTOR_VECTOR_COLUMN
88
92
  EMBEDFLOW_PGVECTOR_TEXT_COLUMN
89
93
  EMBEDFLOW_PGVECTOR_HNSW_EF_SEARCH
90
94
  EMBEDFLOW_PGVECTOR_IVFFLAT_PROBES
95
+ EMBEDFLOW_PINECONE_HOST
96
+ EMBEDFLOW_PINECONE_INDEX_NAME
97
+ EMBEDFLOW_PINECONE_NAMESPACE
98
+ EMBEDFLOW_PINECONE_TEXT_METADATA_FIELD
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
91
109
  EMBEDFLOW_INDEX_NPROBE
92
110
  EMBEDFLOW_DOCUMENTS_PATH
93
111
  EMBEDFLOW_CACHE_PATH
@@ -31,6 +31,8 @@ python -m pip install -e .
31
31
  | `faiss` | FAISS source-index adapter |
32
32
  | `qdrant` | Qdrant client and adapter |
33
33
  | `pgvector` | Psycopg 3 binary driver and pgvector adapter |
34
+ | `pinecone` | Official Pinecone Python SDK and adapter |
35
+ | `milvus` | Official pymilvus SDK and adapter |
34
36
  | `models` | PyTorch, Transformers, Sentence Transformers, and Hub client |
35
37
  | `dashboard` | FastAPI, Uvicorn, and Pydantic |
36
38
  | `dev` | Pytest, Ruff, and build tooling |
@@ -59,6 +61,18 @@ Install the optional adapter with `python -m pip install "embedflow[pgvector]"`.
59
61
  The adapter connects to an existing table and reads the DSN from the
60
62
  environment; see [`integrations/pgvector.md`](integrations/pgvector.md).
61
63
 
64
+ ## Pinecone
65
+
66
+ Install the optional adapter with `python -m pip install "embedflow[pinecone]"`.
67
+ Set `PINECONE_API_KEY` in the environment and configure an existing dense
68
+ index host; see [`integrations/pinecone.md`](integrations/pinecone.md).
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
+
62
76
  ## CPU and GPU
63
77
 
64
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.
@@ -0,0 +1,157 @@
1
+ # Pinecone
2
+
3
+ EmbedFlow can use an existing Pinecone dense index as its source candidate
4
+ layer. It queries that index, reranks the returned documents with the target
5
+ embedding model, and materializes target vectors into EmbedFlow's local cache.
6
+ The source index is read-only during normal operation.
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ python -m pip install "embedflow[pinecone]"
12
+ ```
13
+
14
+ The extra installs the official `pinecone` Python SDK. The base package does
15
+ not import or require it.
16
+
17
+ ## Configure an existing index
18
+
19
+ Set the API key in the environment, never in YAML:
20
+
21
+ ```bash
22
+ export PINECONE_API_KEY='...'
23
+ ```
24
+
25
+ Use the data-plane host copied from the Pinecone console:
26
+
27
+ ```yaml
28
+ source:
29
+ model: sentence-transformers/all-MiniLM-L6-v2
30
+ dimension: 384
31
+ device: cuda
32
+
33
+ target:
34
+ model: Qwen/Qwen3-Embedding-0.6B
35
+ device: cuda
36
+
37
+ index:
38
+ backend: pinecone
39
+ api_key_env: PINECONE_API_KEY
40
+ host: my-index-xxxxx.svc.aped-xxxx.pinecone.io
41
+ namespace: production
42
+ metric: cosine
43
+ text_metadata_field: text
44
+
45
+ documents:
46
+ # Omit this file when text_metadata_field is present in Pinecone metadata.
47
+ # If present, it is used as the external text resolver instead.
48
+ path: ./documents.jsonl
49
+ id_field: id
50
+ text_field: text
51
+ ```
52
+
53
+ `host` takes precedence when both `host` and `index_name` are supplied. If a
54
+ host is unavailable, `index_name` can resolve through the control plane; host
55
+ targeting is recommended for production data-plane traffic. The configured
56
+ namespace is passed on every query and fetch. An empty namespace selects
57
+ Pinecone's default namespace.
58
+
59
+ The source index must be a dense vector index whose dimension and metric match
60
+ the source model contract. Pinecone IDs remain strings, including numeric-
61
+ looking IDs such as `"42"`, UUID-looking values, Unicode, and punctuation.
62
+
63
+ ## Document text
64
+
65
+ EmbedFlow needs candidate text for target-model encoding. There are two modes:
66
+
67
+ * Set `text_metadata_field` to read text from Pinecone metadata. Candidate
68
+ queries request metadata but never request vector values. Missing or
69
+ non-string text is reported with the candidate ID and field name.
70
+ * Provide the normal JSONL `documents` store when Pinecone contains IDs and
71
+ vectors only. The external store remains the source of text and avoids
72
+ duplicating a corpus in Pinecone.
73
+
74
+ ## Commands
75
+
76
+ ```bash
77
+ embedflow doctor --config embedflow.yaml
78
+ embedflow audit-index --config embedflow.yaml
79
+ embedflow analyze --config embedflow.yaml
80
+ embedflow serve --config embedflow.yaml
81
+ embedflow search --config embedflow.yaml "what causes auroras?"
82
+ embedflow status --config embedflow.yaml
83
+ ```
84
+
85
+ `audit-index` separates backend health from retrieval fidelity. It checks SDK
86
+ and credentials, reachability, namespace stats, dimension, metric, dense
87
+ vector type, a small candidate query, and text resolution where possible. A
88
+ successful API call is not an ANN recall or T2-v1 compatibility guarantee.
89
+
90
+ ## Read-only behavior
91
+
92
+ `doctor`, `audit-index`, `analyze`, `serve`, `search`, `status`, and `prewarm`
93
+ only query the configured index. EmbedFlow does not create or delete indexes,
94
+ upsert or delete vectors, alter metadata, or change namespaces. Test fixtures
95
+ may create temporary indexes explicitly, but production initialization never
96
+ does.
97
+
98
+ ## Metrics and limits
99
+
100
+ `cosine`, `dot`/`inner_product` (Pinecone `dotproduct`), and
101
+ `l2`/`euclidean` are accepted. Cosine and dot-product scores already rank
102
+ higher-is-better. Pinecone's Euclidean score is squared distance, so EmbedFlow
103
+ negates it to preserve the shared higher-is-better convention. Query `top_k`
104
+ is validated in the range 1–10,000, matching the Pinecone API limit.
105
+
106
+ ## Integrated embedding indexes
107
+
108
+ Pinecone indexes created with hosted/integrated embedding manage the source
109
+ embedding contract outside EmbedFlow. Unless the source model, dimension, and
110
+ metric can be verified, EmbedFlow reports that contract as unknown; it does not
111
+ assume Pinecone's hosted model is the configured source encoder. The first
112
+ adapter release is intended for standard dense-vector indexes.
113
+
114
+ ## Eventual consistency and tests
115
+
116
+ Pinecone is eventually consistent after writes. Any test setup that creates a
117
+ temporary fixture must poll `describe_index_stats` with a bounded timeout before
118
+ querying it. EmbedFlow's production adapter performs no writes and therefore
119
+ does not need a write-read delay.
120
+
121
+ ## Troubleshooting
122
+
123
+ * `Pinecone support requires ...`: install `embedflow[pinecone]` in the active
124
+ environment.
125
+ * `Environment variable PINECONE_API_KEY is not set.`: export the variable
126
+ named by `api_key_env`.
127
+ * `Unable to reach configured Pinecone index`: check the host, project, and
128
+ network policy. Credentials are not printed in this error.
129
+ * Dimension or metric mismatch: compare the source model contract with the
130
+ existing index configuration; EmbedFlow will not rewrite the index.
131
+ * Missing metadata text: set the correct `text_metadata_field` or provide an
132
+ external JSONL document store.
133
+
134
+ ## Local smoke fixture
135
+
136
+ The repository includes a non-destructive smoke helper for an existing index:
137
+
138
+ ```bash
139
+ export PINECONE_API_KEY='...'
140
+ python scripts/pinecone_smoke.py \
141
+ --host "$PINECONE_INDEX_HOST" \
142
+ --namespace production
143
+ ```
144
+
145
+ It only describes stats and, when given a query vector, performs a query. It
146
+ never upserts or deletes records. A remote create/query/delete integration is
147
+ opt-in and requires both `EMBEDFLOW_PINECONE_INTEGRATION_TEST=1` and
148
+ `EMBEDFLOW_PINECONE_CREATE_TEST_INDEX=1`; it uses a unique disposable index and
149
+ deletes it in teardown.
150
+
151
+ ## Limitations
152
+
153
+ The adapter uses one synchronous SDK client. The SDK call itself is safe for
154
+ the modest concurrent serving loads tested by EmbedFlow, but no connection pool
155
+ is introduced. Metadata filters are not exposed because the shared
156
+ `VectorIndex` contract has no portable filter field. Pinecone index provisioning
157
+ and namespace administration remain outside EmbedFlow.
@@ -1,6 +1,6 @@
1
1
  # Limitations and release scope
2
2
 
3
- EmbedFlow v0.2.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