First-party dirsql plugin: semantic search via an OpenAI-compatible embeddings endpoint.
Project description
dirsql-plugin-embeddings
A first-party dirsql plugin that
adds semantic search over a directory of documents -- Markdown, plain
text, reStructuredText and PDFs. It is the worked
implementation behind the Search documents by
meaning how-to,
swapping that guide's local model2vec model for any OpenAI-compatible
/v1/embeddings endpoint.
uvx --with dirsql-plugin-embeddings dirsql
Deliberately minimal (v0.1): one embedding provider shape, one table, no chunking, no config surface beyond three environment variables.
How it works
The plugin ships a dirsql.toml fragment that dirsql discovers when the package
is installed alongside it. The fragment declares:
- the
sqlite-vecextension, forvec_distance_cosine(); - a
documentstable whoseon-filehook embeds each**/*.{md,markdown,mdx,rst,txt,pdf}file into a TEXTembeddingcolumn; - a
pre-queryhook that embeds the incoming question and emits the nearest-neighbor SQL.
Both hooks are console scripts that call the same embedder.
Every matched extension except .pdf is read as UTF-8 text; a .pdf is read with
pypdf, whose per-page extracted text is joined
and embedded like any other document. The extension check is case-insensitive
(.PDF is a PDF), though the glob above is not — globset matches case-sensitively,
so an uppercase-suffixed file needs its own glob entry to be picked up at all.
The glob is an allowlist rather than **/* on cost, not correctness. Every
matched file costs a hook subprocess, and every file the plugin can decode costs
a billed embedding call — so pointing **/* at a tree containing node_modules
or .git makes for a slow and expensive scan. The list is what is worth
embedding; widening it trades money for recall.
A file the plugin cannot read is skipped, not fatal. The hook exits non-zero,
dirsql names the file on stderr and carries on indexing the rest, and the run
exits 23 — "completed, some files skipped". From the SDK the same information
is on scan_failures() / scanFailures(). A scanned, image-only PDF is not a
failure at all: pypdf yields no text, and the file is indexed with an empty
text, exactly like an empty .md.
Configuration
The embedder reads three environment variables (point them at any hosted or self-managed OpenAI-compatible inference server):
| Variable | Meaning |
|---|---|
DIRSQL_EMBEDDINGS_BASE_URL |
Base URL; /v1/embeddings is appended. |
DIRSQL_EMBEDDINGS_MODEL |
Model name sent in the request. |
DIRSQL_EMBEDDINGS_API_KEY |
Bearer token for Authorization. |
Console scripts
| Script | Hook | Input | Output |
|---|---|---|---|
dirsql-embeddings-on-file |
on-file |
a file's absolute path (argv[1]), text or PDF |
one-line JSON row array with path, text, embedding |
dirsql-embeddings-pre-query |
pre-query |
a raw request body (argv[1]) |
nearest-neighbor SQL over documents |
pre-query accepts both a verbatim server body ({"q": ...}) and the CLI
query subcommand's {"sql": <arg>} wrapper, so dirsql query '{"q": ...}' and
a real POST /query both work.
Tests
Three tiers, per the dirsql testing conventions:
- unit (colocated, mocked seams) —
src/dirsql_plugin_embeddings/*_test.py - integration (
tests/integration/) — each console script as a real subprocess against a local stub/v1/embeddingsserver - e2e (
tests/e2e/) — the full loop through the real launcher +dirsqlbinary +sqlite-vec, nothing mocked but the embedding endpoint
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dirsql_plugin_embeddings-0.1.9.tar.gz.
File metadata
- Download URL: dirsql_plugin_embeddings-0.1.9.tar.gz
- Upload date:
- Size: 10.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b2d9ac451de97e90fa4f8dcc731db44b425eff8be58e7f847336ff853f11f85
|
|
| MD5 |
5c7335e4e824ce1050a18b802cf237dc
|
|
| BLAKE2b-256 |
107cb230cb8349eea579da2770b0d2e5b94e80ed3bafd94a9c3fd832c7fdf00b
|
Provenance
The following attestation bundles were made for dirsql_plugin_embeddings-0.1.9.tar.gz:
Publisher:
release.yml on thekevinscott/dirsql
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dirsql_plugin_embeddings-0.1.9.tar.gz -
Subject digest:
6b2d9ac451de97e90fa4f8dcc731db44b425eff8be58e7f847336ff853f11f85 - Sigstore transparency entry: 2325293649
- Sigstore integration time:
-
Permalink:
thekevinscott/dirsql@27550aa6e9bd3a2a0378bd040eb8ff62f833114c -
Branch / Tag:
refs/heads/main - Owner: https://github.com/thekevinscott
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@27550aa6e9bd3a2a0378bd040eb8ff62f833114c -
Trigger Event:
push
-
Statement type:
File details
Details for the file dirsql_plugin_embeddings-0.1.9-py3-none-any.whl.
File metadata
- Download URL: dirsql_plugin_embeddings-0.1.9-py3-none-any.whl
- Upload date:
- Size: 11.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
714774e1a2c2ff90d6404e7ba7b7512486bc8d2f17e6060479687c9a4e55522c
|
|
| MD5 |
83924031165e8a55c56c32f3f206a898
|
|
| BLAKE2b-256 |
7645f243f51881013b67cd0a148cfe8e6b3c331adfff4a021ab6c509159fad8d
|
Provenance
The following attestation bundles were made for dirsql_plugin_embeddings-0.1.9-py3-none-any.whl:
Publisher:
release.yml on thekevinscott/dirsql
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dirsql_plugin_embeddings-0.1.9-py3-none-any.whl -
Subject digest:
714774e1a2c2ff90d6404e7ba7b7512486bc8d2f17e6060479687c9a4e55522c - Sigstore transparency entry: 2325293947
- Sigstore integration time:
-
Permalink:
thekevinscott/dirsql@27550aa6e9bd3a2a0378bd040eb8ff62f833114c -
Branch / Tag:
refs/heads/main - Owner: https://github.com/thekevinscott
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@27550aa6e9bd3a2a0378bd040eb8ff62f833114c -
Trigger Event:
push
-
Statement type: