baked-vector 0.1.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.
@@ -0,0 +1,225 @@
1
+ Metadata-Version: 2.4
2
+ Name: baked-vector
3
+ Version: 0.1.0
4
+ Summary: Zero-dependency vector store for small-scale embedding search.
5
+ License: MIT
6
+ Project-URL: Repository, https://github.com/sunnytuladhar/baked-vector
7
+ Requires-Python: >=3.11
8
+ Description-Content-Type: text/markdown
9
+ Provides-Extra: st
10
+ Requires-Dist: sentence-transformers>=3.0; extra == "st"
11
+ Provides-Extra: openai
12
+ Requires-Dist: openai>=1.0; extra == "openai"
13
+ Provides-Extra: bedrock
14
+ Requires-Dist: boto3>=1.34; extra == "bedrock"
15
+ Provides-Extra: google
16
+ Requires-Dist: google-generativeai>=0.8; extra == "google"
17
+ Provides-Extra: anthropic
18
+ Requires-Dist: anthropic>=0.40; extra == "anthropic"
19
+
20
+ # baked-vector
21
+
22
+ Zero-dependency vector store for small-scale embedding search. No numpy, no server, no setup — just a binary file and a JSON file baked into your project.
23
+
24
+ Designed for under 10,000 vectors. Bring your own embeddings.
25
+
26
+ ## Install
27
+
28
+ ```bash
29
+ pip install baked-vector
30
+ # or
31
+ uv add baked-vector
32
+ ```
33
+
34
+ ## Usage
35
+
36
+ ```python
37
+ import baked
38
+
39
+ store = baked.VectorStore("mydata")
40
+
41
+ # add vectors with arbitrary metadata
42
+ store.add(embedding, {"source": "doc1.pdf", "page": 3, "text": "..."})
43
+ store.save()
44
+
45
+ # reload from disk automatically
46
+ store = baked.VectorStore("mydata")
47
+
48
+ # search
49
+ results = store.search(query_embedding, top_k=5)
50
+ # [(metadata_dict, score), ...]
51
+
52
+ # filter by metadata
53
+ results = store.search(query_embedding, top_k=5, filter={"source": "doc1.pdf"})
54
+
55
+ # range search — all results with score >= threshold
56
+ results = store.search(query_embedding, radius=0.85)
57
+
58
+ # batch search
59
+ results = store.search_many([vec1, vec2], top_k=5)
60
+ ```
61
+
62
+ ## API
63
+
64
+ ### `VectorStore(path)`
65
+
66
+ Loads from `<path>.vecs` and `<path>.json` if they exist, otherwise starts empty.
67
+
68
+ | Method | Description |
69
+ |--------|-------------|
70
+ | `add(embedding, metadata)` | Add a vector. Returns its id. |
71
+ | `remove(id)` | Soft-delete. Takes effect on next `save()`. |
72
+ | `save()` | Flush to disk, compacting deleted entries. |
73
+ | `search(query, top_k, radius, filter)` | Find similar vectors. |
74
+ | `search_many(queries, top_k, radius, filter)` | Batch search. |
75
+ | `len(store)` | Number of active vectors. |
76
+
77
+ ### Search parameters
78
+
79
+ - `top_k` — return top N results (default: 5)
80
+ - `radius` — return all results with score ≥ threshold (overrides `top_k`)
81
+ - `filter` — dict of key-value pairs that must match the metadata exactly
82
+
83
+ Scores are cosine similarity in range [-1, 1]. Higher = more similar.
84
+
85
+ ## Storage format
86
+
87
+ Two files:
88
+
89
+ - `<path>.vecs` — binary packed floats. 8-byte header (dim, count), then N × dim × 4 bytes.
90
+ - `<path>.json` — JSON array of metadata dicts, one per vector.
91
+
92
+ Vectors are L2-normalized at insert time. IDs are positional and shift after `save()` following a `remove()`.
93
+
94
+ ## Performance
95
+
96
+ Pure Python, brute-force scan. Rough query times:
97
+
98
+ | Vectors | 384-dim | 768-dim | 1536-dim |
99
+ |---------|---------|---------|----------|
100
+ | 1k | <0.1s | <0.1s | ~0.1s |
101
+ | 5k | ~0.1s | ~0.3s | ~0.5s |
102
+ | 10k | ~0.3s | ~0.6s | ~1–2s |
103
+
104
+ ## EmbeddingStore
105
+
106
+ `EmbeddingStore` wraps `VectorStore` and handles embedding automatically. Install an extra for your provider, pass the adapter, and work with text directly.
107
+
108
+ ```python
109
+ import baked
110
+
111
+ embed = baked.openai_embedder() # see adapters below
112
+ store = baked.EmbeddingStore("mydata", embedder=embed)
113
+
114
+ store.add("Wealth is not money...", {"title": "How to Make Wealth"})
115
+ store.save()
116
+
117
+ results = store.search("how startups create value", top_k=3)
118
+ # [({"text": "...", "title": "..."}, score), ...]
119
+ ```
120
+
121
+ `EmbeddingStore` exposes the same `add`, `remove`, `save`, `search`, and `len` interface as `VectorStore`, but takes `str` instead of `list[float]`. The original text is stored in metadata under `"text"` automatically.
122
+
123
+ ### Adapters
124
+
125
+ | Provider | Function | Install extra |
126
+ |----------|----------|---------------|
127
+ | OpenAI | `openai_embedder(model, api_key)` | `baked-vector[openai]` |
128
+ | Azure OpenAI | `azure_openai_embedder(deployment, endpoint, api_key, api_version)` | `baked-vector[openai]` |
129
+ | AWS Bedrock | `bedrock_embedder(model_id, region_name)` | `baked-vector[bedrock]` |
130
+ | Google | `google_embedder(model, api_key)` | `baked-vector[google]` |
131
+ | Local (sentence-transformers) | `sentence_transformer_embedder(model_name)` | `baked-vector[st]` |
132
+
133
+ ```bash
134
+ pip install baked-vector[openai]
135
+ pip install baked-vector[bedrock]
136
+ pip install baked-vector[google]
137
+ pip install baked-vector[st]
138
+ ```
139
+
140
+ Defaults: OpenAI → `text-embedding-3-small`, Bedrock → `amazon.titan-embed-text-v2:0`, Google → `models/text-embedding-004`, local → `all-MiniLM-L6-v2`.
141
+
142
+ You can also pass any `(str) -> list[float]` callable as `embedder` — no adapter required.
143
+
144
+ ---
145
+
146
+ ## Providers (manual)
147
+
148
+ baked-vector stores and searches vectors — bring embeddings from any provider.
149
+
150
+ ### OpenAI
151
+
152
+ ```python
153
+ from openai import OpenAI
154
+
155
+ client = OpenAI()
156
+
157
+ def embed(text: str) -> list[float]:
158
+ resp = client.embeddings.create(model="text-embedding-3-small", input=text)
159
+ return resp.data[0].embedding
160
+
161
+ store.add(embed("hello world"), {"text": "hello world"})
162
+ results = store.search(embed("hi there"), top_k=5)
163
+ ```
164
+
165
+ ### AWS Bedrock (Titan)
166
+
167
+ ```python
168
+ import json
169
+ import boto3
170
+
171
+ bedrock = boto3.client("bedrock-runtime", region_name="us-east-1")
172
+
173
+ def embed(text: str) -> list[float]:
174
+ resp = bedrock.invoke_model(
175
+ modelId="amazon.titan-embed-text-v2:0",
176
+ body=json.dumps({"inputText": text, "dimensions": 512}),
177
+ )
178
+ return json.loads(resp["body"].read())["embedding"]
179
+
180
+ store.add(embed("hello world"), {"text": "hello world"})
181
+ results = store.search(embed("hi there"), top_k=5)
182
+ ```
183
+
184
+ ### Azure OpenAI
185
+
186
+ ```python
187
+ from openai import AzureOpenAI
188
+
189
+ client = AzureOpenAI(
190
+ api_key="YOUR_KEY",
191
+ api_version="2024-02-01",
192
+ azure_endpoint="https://YOUR_RESOURCE.openai.azure.com",
193
+ )
194
+
195
+ def embed(text: str) -> list[float]:
196
+ resp = client.embeddings.create(model="YOUR_DEPLOYMENT_NAME", input=text)
197
+ return resp.data[0].embedding
198
+
199
+ store.add(embed("hello world"), {"text": "hello world"})
200
+ results = store.search(embed("hi there"), top_k=5)
201
+ ```
202
+
203
+ ### Cohere
204
+
205
+ ```python
206
+ import cohere
207
+
208
+ co = cohere.Client("YOUR_API_KEY")
209
+
210
+ def embed(text: str) -> list[float]:
211
+ resp = co.embed(texts=[text], model="embed-english-v3.0", input_type="search_document")
212
+ return resp.embeddings[0]
213
+
214
+ store.add(embed("hello world"), {"text": "hello world"})
215
+
216
+ # use input_type="search_query" for query embeddings
217
+ results = store.search(
218
+ co.embed(texts=["hi there"], model="embed-english-v3.0", input_type="search_query").embeddings[0],
219
+ top_k=5,
220
+ )
221
+ ```
222
+
223
+ ## License
224
+
225
+ MIT
@@ -0,0 +1,206 @@
1
+ # baked-vector
2
+
3
+ Zero-dependency vector store for small-scale embedding search. No numpy, no server, no setup — just a binary file and a JSON file baked into your project.
4
+
5
+ Designed for under 10,000 vectors. Bring your own embeddings.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ pip install baked-vector
11
+ # or
12
+ uv add baked-vector
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ```python
18
+ import baked
19
+
20
+ store = baked.VectorStore("mydata")
21
+
22
+ # add vectors with arbitrary metadata
23
+ store.add(embedding, {"source": "doc1.pdf", "page": 3, "text": "..."})
24
+ store.save()
25
+
26
+ # reload from disk automatically
27
+ store = baked.VectorStore("mydata")
28
+
29
+ # search
30
+ results = store.search(query_embedding, top_k=5)
31
+ # [(metadata_dict, score), ...]
32
+
33
+ # filter by metadata
34
+ results = store.search(query_embedding, top_k=5, filter={"source": "doc1.pdf"})
35
+
36
+ # range search — all results with score >= threshold
37
+ results = store.search(query_embedding, radius=0.85)
38
+
39
+ # batch search
40
+ results = store.search_many([vec1, vec2], top_k=5)
41
+ ```
42
+
43
+ ## API
44
+
45
+ ### `VectorStore(path)`
46
+
47
+ Loads from `<path>.vecs` and `<path>.json` if they exist, otherwise starts empty.
48
+
49
+ | Method | Description |
50
+ |--------|-------------|
51
+ | `add(embedding, metadata)` | Add a vector. Returns its id. |
52
+ | `remove(id)` | Soft-delete. Takes effect on next `save()`. |
53
+ | `save()` | Flush to disk, compacting deleted entries. |
54
+ | `search(query, top_k, radius, filter)` | Find similar vectors. |
55
+ | `search_many(queries, top_k, radius, filter)` | Batch search. |
56
+ | `len(store)` | Number of active vectors. |
57
+
58
+ ### Search parameters
59
+
60
+ - `top_k` — return top N results (default: 5)
61
+ - `radius` — return all results with score ≥ threshold (overrides `top_k`)
62
+ - `filter` — dict of key-value pairs that must match the metadata exactly
63
+
64
+ Scores are cosine similarity in range [-1, 1]. Higher = more similar.
65
+
66
+ ## Storage format
67
+
68
+ Two files:
69
+
70
+ - `<path>.vecs` — binary packed floats. 8-byte header (dim, count), then N × dim × 4 bytes.
71
+ - `<path>.json` — JSON array of metadata dicts, one per vector.
72
+
73
+ Vectors are L2-normalized at insert time. IDs are positional and shift after `save()` following a `remove()`.
74
+
75
+ ## Performance
76
+
77
+ Pure Python, brute-force scan. Rough query times:
78
+
79
+ | Vectors | 384-dim | 768-dim | 1536-dim |
80
+ |---------|---------|---------|----------|
81
+ | 1k | <0.1s | <0.1s | ~0.1s |
82
+ | 5k | ~0.1s | ~0.3s | ~0.5s |
83
+ | 10k | ~0.3s | ~0.6s | ~1–2s |
84
+
85
+ ## EmbeddingStore
86
+
87
+ `EmbeddingStore` wraps `VectorStore` and handles embedding automatically. Install an extra for your provider, pass the adapter, and work with text directly.
88
+
89
+ ```python
90
+ import baked
91
+
92
+ embed = baked.openai_embedder() # see adapters below
93
+ store = baked.EmbeddingStore("mydata", embedder=embed)
94
+
95
+ store.add("Wealth is not money...", {"title": "How to Make Wealth"})
96
+ store.save()
97
+
98
+ results = store.search("how startups create value", top_k=3)
99
+ # [({"text": "...", "title": "..."}, score), ...]
100
+ ```
101
+
102
+ `EmbeddingStore` exposes the same `add`, `remove`, `save`, `search`, and `len` interface as `VectorStore`, but takes `str` instead of `list[float]`. The original text is stored in metadata under `"text"` automatically.
103
+
104
+ ### Adapters
105
+
106
+ | Provider | Function | Install extra |
107
+ |----------|----------|---------------|
108
+ | OpenAI | `openai_embedder(model, api_key)` | `baked-vector[openai]` |
109
+ | Azure OpenAI | `azure_openai_embedder(deployment, endpoint, api_key, api_version)` | `baked-vector[openai]` |
110
+ | AWS Bedrock | `bedrock_embedder(model_id, region_name)` | `baked-vector[bedrock]` |
111
+ | Google | `google_embedder(model, api_key)` | `baked-vector[google]` |
112
+ | Local (sentence-transformers) | `sentence_transformer_embedder(model_name)` | `baked-vector[st]` |
113
+
114
+ ```bash
115
+ pip install baked-vector[openai]
116
+ pip install baked-vector[bedrock]
117
+ pip install baked-vector[google]
118
+ pip install baked-vector[st]
119
+ ```
120
+
121
+ Defaults: OpenAI → `text-embedding-3-small`, Bedrock → `amazon.titan-embed-text-v2:0`, Google → `models/text-embedding-004`, local → `all-MiniLM-L6-v2`.
122
+
123
+ You can also pass any `(str) -> list[float]` callable as `embedder` — no adapter required.
124
+
125
+ ---
126
+
127
+ ## Providers (manual)
128
+
129
+ baked-vector stores and searches vectors — bring embeddings from any provider.
130
+
131
+ ### OpenAI
132
+
133
+ ```python
134
+ from openai import OpenAI
135
+
136
+ client = OpenAI()
137
+
138
+ def embed(text: str) -> list[float]:
139
+ resp = client.embeddings.create(model="text-embedding-3-small", input=text)
140
+ return resp.data[0].embedding
141
+
142
+ store.add(embed("hello world"), {"text": "hello world"})
143
+ results = store.search(embed("hi there"), top_k=5)
144
+ ```
145
+
146
+ ### AWS Bedrock (Titan)
147
+
148
+ ```python
149
+ import json
150
+ import boto3
151
+
152
+ bedrock = boto3.client("bedrock-runtime", region_name="us-east-1")
153
+
154
+ def embed(text: str) -> list[float]:
155
+ resp = bedrock.invoke_model(
156
+ modelId="amazon.titan-embed-text-v2:0",
157
+ body=json.dumps({"inputText": text, "dimensions": 512}),
158
+ )
159
+ return json.loads(resp["body"].read())["embedding"]
160
+
161
+ store.add(embed("hello world"), {"text": "hello world"})
162
+ results = store.search(embed("hi there"), top_k=5)
163
+ ```
164
+
165
+ ### Azure OpenAI
166
+
167
+ ```python
168
+ from openai import AzureOpenAI
169
+
170
+ client = AzureOpenAI(
171
+ api_key="YOUR_KEY",
172
+ api_version="2024-02-01",
173
+ azure_endpoint="https://YOUR_RESOURCE.openai.azure.com",
174
+ )
175
+
176
+ def embed(text: str) -> list[float]:
177
+ resp = client.embeddings.create(model="YOUR_DEPLOYMENT_NAME", input=text)
178
+ return resp.data[0].embedding
179
+
180
+ store.add(embed("hello world"), {"text": "hello world"})
181
+ results = store.search(embed("hi there"), top_k=5)
182
+ ```
183
+
184
+ ### Cohere
185
+
186
+ ```python
187
+ import cohere
188
+
189
+ co = cohere.Client("YOUR_API_KEY")
190
+
191
+ def embed(text: str) -> list[float]:
192
+ resp = co.embed(texts=[text], model="embed-english-v3.0", input_type="search_document")
193
+ return resp.embeddings[0]
194
+
195
+ store.add(embed("hello world"), {"text": "hello world"})
196
+
197
+ # use input_type="search_query" for query embeddings
198
+ results = store.search(
199
+ co.embed(texts=["hi there"], model="embed-english-v3.0", input_type="search_query").embeddings[0],
200
+ top_k=5,
201
+ )
202
+ ```
203
+
204
+ ## License
205
+
206
+ MIT
@@ -0,0 +1,25 @@
1
+ from .store import VectorStore
2
+ from .embed import (
3
+ EmbeddingStore,
4
+ sentence_transformer_embedder,
5
+ openai_embedder,
6
+ azure_openai_embedder,
7
+ bedrock_embedder,
8
+ google_embedder,
9
+ )
10
+ from .chunking import chunk_fixed, chunk_sentences, chunk_paragraphs, chunk_recursive
11
+
12
+ __all__ = [
13
+ "VectorStore",
14
+ "EmbeddingStore",
15
+ "sentence_transformer_embedder",
16
+ "openai_embedder",
17
+ "azure_openai_embedder",
18
+ "bedrock_embedder",
19
+ "google_embedder",
20
+ "chunk_fixed",
21
+ "chunk_sentences",
22
+ "chunk_paragraphs",
23
+ "chunk_recursive",
24
+ ]
25
+ __version__ = "0.1.0"