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.
- {embedflow-0.2.0 → embedflow-0.4.0}/CHANGELOG.md +17 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/CITATION.cff +1 -1
- {embedflow-0.2.0 → embedflow-0.4.0}/CONTRIBUTING.md +1 -1
- {embedflow-0.2.0 → embedflow-0.4.0}/MANIFEST.in +1 -1
- {embedflow-0.2.0 → embedflow-0.4.0}/PKG-INFO +27 -5
- {embedflow-0.2.0 → embedflow-0.4.0}/README.md +18 -2
- {embedflow-0.2.0 → embedflow-0.4.0}/README_PYPI.md +19 -3
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/api.md +3 -1
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/configuration.md +19 -1
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/installation.md +14 -0
- embedflow-0.4.0/docs/integrations/milvus.md +165 -0
- embedflow-0.4.0/docs/integrations/pinecone.md +157 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/limitations.md +1 -1
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/releasing.md +7 -7
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/__init__.py +2 -2
- embedflow-0.4.0/embedflow/api.py +10 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/cli.py +172 -35
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/evaluate.py +3 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/config.py +152 -8
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/indexes/__init__.py +4 -0
- embedflow-0.4.0/embedflow/indexes/milvus_backend.py +1056 -0
- embedflow-0.4.0/embedflow/indexes/pinecone_backend.py +764 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/migration/facade.py +76 -15
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/runtime.py +39 -6
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow.egg-info/PKG-INFO +27 -5
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow.egg-info/SOURCES.txt +15 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow.egg-info/requires.txt +8 -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/README.md +32 -0
- embedflow-0.4.0/examples/pinecone/embedflow.yaml.example +35 -0
- embedflow-0.4.0/examples/pinecone/run_smoke.sh +8 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/pyproject.toml +6 -2
- embedflow-0.4.0/scripts/milvus_fixture.py +102 -0
- embedflow-0.4.0/scripts/pinecone_smoke.py +54 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/scripts/release_gate.py +24 -4
- embedflow-0.4.0/scripts/validate_milvus.py +356 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/scripts/validate_pgvector_10k.py +2 -2
- {embedflow-0.2.0 → embedflow-0.4.0}/LICENSE +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/SECURITY.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/assets/README.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/assets/candidate-gap-example.svg +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/assets/dashboard-screenshot.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/assets/terminal-demo.txt +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/cli.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/concepts.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/contributing-benchmarks.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/economics.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/integrations/faiss.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/integrations/pgvector.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/integrations/qdrant.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/methodology.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/quickstart.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/docs/registry.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/__main__.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/analysis.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/cache/__init__.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/cache/base.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/cache/persistent_cache.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/__init__.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/candidate_gap.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/containment.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/metrics.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/migration_depth.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/probe.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/report.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/compatibility/t2.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/__init__.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/__init__.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/benchmark_profiles.jsonl +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/checksums.sha256 +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/migrations.jsonl +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/registry_manifest.json +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/research_summaries.json +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/data/registry/schema_version.json +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/frozen/T2_V1_FROZEN_SPEC.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/frozen/T2_V1_FROZEN_SPEC.sha256 +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/indexes/base.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/indexes/faiss_backend.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/indexes/pgvector_backend.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/indexes/qdrant_backend.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/metrics/__init__.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/metrics/latency.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/migration/__init__.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/migration/compatibility.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/migration/materializer.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/migration/planner.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/migration/state.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/models/__init__.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/models/base.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/models/huggingface.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/registry/__init__.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/registry/loader.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/registry/matcher.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/registry/schema.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/serving/__init__.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/serving/api.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/serving/engine.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/serving/factory.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow/serving/schemas.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow.egg-info/dependency_links.txt +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow.egg-info/entry_points.txt +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/embedflow.egg-info/top_level.txt +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/faiss/README.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/faiss/documents.jsonl +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/faiss/embedflow.yaml +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/faiss/queries.jsonl +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/README.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/build_index.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/compose.yaml +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/embedflow.yaml +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/init.sql +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/queries.jsonl +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/pgvector/run_demo.sh +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/qdrant/README.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/qdrant/build_index.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/qdrant/documents.jsonl +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/qdrant/embedflow.yaml +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/qdrant/queries.jsonl +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/research_analysis/README.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/research_analysis/documents.jsonl +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/research_analysis/embedflow.yaml +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/research_analysis/qrels.json +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/examples/research_analysis/queries.jsonl +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/frozen/T2_V1_FROZEN_SPEC.md +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/frozen/T2_V1_FROZEN_SPEC.sha256 +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/requirements-dev.txt +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/requirements.txt +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/scripts/real_qdrant_smoke.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/scripts/run_demo.sh +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/scripts/run_tests.sh +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/setup.cfg +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/src/__init__.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/src/embed.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/src/probe_features.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/src/storage.py +0 -0
- {embedflow-0.2.0 → embedflow-0.4.0}/src/t2_v1.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
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
|
|