Generate a self-contained, filesystem-based
agentskills.io skill that wraps a
haiku-rag-built LanceDB RAG database.
Unlike haiku-rag create-skill (which emits a haiku-skills entrypoint
package consumed by haiku-rag's own pydantic-ai agent), the skill produced
here is driven by an external agent (e.g. Claude Code) that invokes a
script. The generated skill provides a PEP 723 wrapper,
scripts/haiku_rag.py, exposing search and cite subcommands implemented
over the haiku-rag Python client — there is no haiku-rag cite CLI
subcommand to shell out to.
📖 Full documentation: https://tseaver.github.io/ragpicker/
uv run ragpicker \
--config path/to/haiku.rag.yaml \
--db path/to/handbook.lancedb \
--output ./skills \
[--haiku-rag-version 0.48.1 | --version-from-project path/to/stack]-
The skill is named from the database directory stem:
handbook.lancedb→handbook-haiku-rag. -
The template under
src/ragpicker/template/[dbname]-haiku-rag/(bundled as package data) is copied with[dbname]substituted by the stem (in path names and text-file contents). -
Both the
.lancedbdatabase and thehaiku.rag.yamlconfig are embedded under the skill'sassets/.
The wrapper pins an exact haiku-rag-slim version so the embedded database
and the runtime always agree. (Only haiku-rag-slim is supported — the full
haiku-rag build's dependency weight is prohibitive for a self-contained
skill.)
-
Default — sniff: the version is read from the database itself (the version that last wrote it, stored in its
settingstable) and pinned as-is. No migration is needed because the database already matches. -
Minimum version: the wrapper's
search/citerely on APIs whose surface is not guaranteed below0.48.1, so generation refuses to pin anything older. A database below that floor must be force-migrated up (see below). -
--haiku-rag-version X— force:Xis pinned in the wrapper and the embedded copy of the database is migrated up toX(viauv tool run --from haiku-rag-slim==X haiku-rag migrate). The original database is left untouched. Downgrades are rejected (haiku-rag migrations only move forward). -
--version-from-project PATH— discover + force: read the effectivehaiku-rag-slimversion from a target project (e.g. a Soliplex stack) and force it the same way. Looks first in the project's.venv(the installed version), then falls back to resolving the project's dependencies withuv tree --package haiku-rag-slim --depth 0. Either path findshaiku-rag-slimeven though it is a transitive dependency ofsoliplex(not named directly inpyproject.toml). Mutually exclusive with--haiku-rag-version.
Forcing requires uv on PATH and network access to fetch the requested
version; most migrations are schema-only, but some may need model access.
cd handbook-haiku-rag
uv run scripts/haiku_rag.py search "<query>" [--limit N] [--filter "<SQL>"]
uv run scripts/haiku_rag.py cite <chunk_id> [<chunk_id> ...]uv resolves the wrapper's pinned haiku-rag dependency on first use. The
wrapper opens the bundled database read-only, so the embedded database and
the pinned version always agree by construction (the generator either sniffs
or migrates to match).
There are two execution models, with different requirements:
-
Standalone (
uv run) — the model above.uvhonors the wrapper's PEP 723 pin, so the runtime always matches the embedded database. -
Embedding host (
sys.executable) — a host such as Soliplex runs the skill script with its own Python interpreter, notuv(e.g.haiku.skillsusesSCRIPT_RUNNERS[".py"] = (sys.executable,)). The wrapper's pin is then ignored: the host's installedhaiku-ragopens the database. The embedded database must match that version, not the wrapper's pin.
So when targeting such a host, generate with --haiku-rag-version <the backend's haiku-rag version> so the embedded database is migrated to match
the interpreter that will open it. On a version mismatch the wrapper now exits
non-zero with an actionable haiku-rag version mismatch message (instead of
failing silently and returning nothing to the agent).
uv run --with pytest --with pylance --with packaging pytest tests/