dirsql-plugin-embeddings 0.1.15__tar.gz → 0.1.16__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.
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/PKG-INFO +6 -1
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/README.md +5 -0
- dirsql_plugin_embeddings-0.1.16/changelog.d/2026-08-12-null-embedding-guard.md +3 -0
- dirsql_plugin_embeddings-0.1.16/e2e-attestations/claude-817-null-embedding-guard.json +7 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/search/sql.py +5 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/.gitignore +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/changelog.d/2026-08-10-delete-old-surface.md +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/changelog.d/2026-08-10-embed-worker.md +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/changelog.d/2026-08-11-one-liner-cli.md +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/changelog.d/2026-08-12-empty-search-reports-why.md +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/changelog.d/2026-08-12-no-per-call-progress-bar.md +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/e2e-attestations/claude-804-embed-worker.json +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/e2e-attestations/claude-805-one-liner.json +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/e2e-attestations/claude-814-suppress-per-call-progress.json +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/e2e-attestations/claude-816-empty-corpus-error.json +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/migrations.d/2026-08-10-delete-old-surface.md +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/pyproject.toml +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/__init__.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/cli/__init__.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/cli/main.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/cli/search.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/cli/worker.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/dirsql.toml +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/embedding/__init__.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/embedding/cache.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/embedding/model.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/embedding/progress.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/embedding/values.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/embedding/worker.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/search/__init__.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/search/output.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/src/dirsql_plugin_embeddings/search/run.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/testing-conventions.toml +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/tests/conftest.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/tests/e2e/__init__.py +0 -0
- {dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/tests/integration/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: dirsql-plugin-embeddings
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.16
|
|
4
4
|
Summary: First-party dirsql plugin: semantic search over files.
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Requires-Dist: cachetta>=0.7
|
|
@@ -26,10 +26,15 @@ uvx --with dirsql-plugin-embeddings dirsql "
|
|
|
26
26
|
SELECT path
|
|
27
27
|
FROM (SELECT path, embed(content ->> 'abstract') AS emb
|
|
28
28
|
FROM './arxiv-firehose/data/**/metadata.json')
|
|
29
|
+
WHERE emb IS NOT NULL
|
|
29
30
|
ORDER BY vec_distance_cosine(emb, embed('local private models'))
|
|
30
31
|
LIMIT 10"
|
|
31
32
|
```
|
|
32
33
|
|
|
34
|
+
`WHERE emb IS NOT NULL` is not optional bookkeeping: a file that is unreadable
|
|
35
|
+
or not valid UTF-8 has NULL content, so its distance is NULL, and SQLite sorts
|
|
36
|
+
NULLs *first* ascending — without the guard those files take the top slots.
|
|
37
|
+
|
|
33
38
|
For the common case — one glob, one question, top-k paths — the package is
|
|
34
39
|
also its own command, generating and running exactly that SQL:
|
|
35
40
|
|
|
@@ -13,10 +13,15 @@ uvx --with dirsql-plugin-embeddings dirsql "
|
|
|
13
13
|
SELECT path
|
|
14
14
|
FROM (SELECT path, embed(content ->> 'abstract') AS emb
|
|
15
15
|
FROM './arxiv-firehose/data/**/metadata.json')
|
|
16
|
+
WHERE emb IS NOT NULL
|
|
16
17
|
ORDER BY vec_distance_cosine(emb, embed('local private models'))
|
|
17
18
|
LIMIT 10"
|
|
18
19
|
```
|
|
19
20
|
|
|
21
|
+
`WHERE emb IS NOT NULL` is not optional bookkeeping: a file that is unreadable
|
|
22
|
+
or not valid UTF-8 has NULL content, so its distance is NULL, and SQLite sorts
|
|
23
|
+
NULLs *first* ascending — without the guard those files take the top slots.
|
|
24
|
+
|
|
20
25
|
For the common case — one glob, one question, top-k paths — the package is
|
|
21
26
|
also its own command, generating and running exactly that SQL:
|
|
22
27
|
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
**Fixed**
|
|
2
|
+
|
|
3
|
+
- **Files that cannot be embedded no longer take the top of the ranking (and no longer break the search).** A matched file that is unreadable, not valid UTF-8, or deleted mid-scan has NULL `content`, so `embed(content)` is NULL — and SQLite sorts NULLs *first* ascending, so those files occupied the top-k slots before anything else went wrong. The generated search SQL now carries `WHERE emb IS NOT NULL`, which fixes the ranking and the failure it led to (a `TypeError` formatting a NULL distance, or, depending on the sqlite-vec build, `Error reading 1st vector: ... found NULL` from SQLite itself). The documented hand-written idiom carries the same guard. (#817)
|
|
@@ -25,9 +25,14 @@ def embed_call(argument, model):
|
|
|
25
25
|
def build_search_sql(glob, query, limit, model=None):
|
|
26
26
|
outer = embed_call(quote(query), model)
|
|
27
27
|
inner = embed_call("content", model)
|
|
28
|
+
# A matched file that is unreadable, not valid UTF-8, or deleted mid-scan
|
|
29
|
+
# has NULL content, so its embedding is NULL too. Dropping those rows is
|
|
30
|
+
# what keeps the ranking honest: a NULL distance sorts FIRST ascending in
|
|
31
|
+
# SQLite, so unrankable files would otherwise take the top-k slots.
|
|
28
32
|
return (
|
|
29
33
|
f"SELECT path, vec_distance_cosine(emb, {outer}) AS distance"
|
|
30
34
|
f" FROM (SELECT path, {inner} AS emb FROM {quote(normalize_glob(glob))})"
|
|
35
|
+
f" WHERE emb IS NOT NULL"
|
|
31
36
|
f" ORDER BY distance LIMIT {int(limit):d}"
|
|
32
37
|
)
|
|
33
38
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/testing-conventions.toml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dirsql_plugin_embeddings-0.1.15 → dirsql_plugin_embeddings-0.1.16}/tests/integration/__init__.py
RENAMED
|
File without changes
|