swan-aisql
SWAN AI-SQL as a pip package: DuckDB with semantic SQL functions (ai_filter, ai_classify, ai_score,
ai_complete, ai_agg, ai_embed, ai_image) and the SWAN optimizer, which folds duplicate prompts,
orders predicates by learned selectivity, pushes LIMIT into the model calls and keeps a fixed number of
requests in flight. Engine, design and benchmarks: https://github.com/ZhaoFuheng/SWAN-AISQL.
pip install "swan-aisql[embed]" # the extension, the pinned duckdb, and the local embeddings server
pip install swan-aisql # without the embeddings server (sentence-transformers + torch)
import os, swan_aisql
con = swan_aisql.connect() # OPENAI_API_KEY from the environment -> OpenAI directly, model gpt-5.6-luna
con.sql("CREATE TABLE reviews AS SELECT * FROM 'reviews.parquet'")
con.sql("""
SELECT critic, review
FROM reviews
WHERE ai_filter('Is this movie review clearly positive? Review: ' || review)
LIMIT 10
""").show()
con.sql("SELECT llm_calls, cache_hits, cost_usd FROM ai_usage()").show()
examples/swan2_formula_1.ipynb walks through this on a SWAN 2.0 benchmark
database, with the model calls each question costs. connect() returns a plain duckdb.DuckDBPyConnection; swan_aisql.load(con) adds the extension to a
connection you opened yourself (with allow_unsigned_extensions).
Endpoint. Any OpenAI-compatible chat endpoint: connect(endpoint="https://api.openai.com"), a litellm
proxy, or the repository's caching proxy (endpoint="http://localhost:4001"). With no endpoint, the
extension uses AI_PROXY_URL from the environment and, failing that, OpenAI when OPENAI_API_KEY is set.
https:// endpoints need the TLS build of the extension, which the published wheels are. Requests carry
temperature: 0; a model that rejects the parameter (the gpt-5 reasoning models answer HTTP 400 to it)
gets the request again without it, and the process leaves it out from then on.
Settings. model, api_key, reasoning_effort and price_input / price_output / price_cached (USD per 1M
tokens, so ai_usage().cost_usd prices a direct endpoint's calls) are keywords; every other SET ai_* option passes
through, e.g. connect(ai_concurrency=50, ai_limit=False). The full list is SELECT * FROM duckdb_settings() WHERE name LIKE 'ai_%' and the repository README.
Embeddings. The learned predicate ordering embeds prompts and inputs through a local server: MiniLM for
text and CLIP for ai_image predicates, the setup every published number used. With the embed extra
installed, connect() starts it when nothing answers on the embeddings endpoint (localhost:4002 unless
ai_embed_endpoint or AI_EMBED_URL says otherwise) and waits for it to listen; the first start downloads
the two models (about 1.2 GB into ~/.cache/huggingface), later starts take a few seconds. The server
outlives the Python process so the next one finds it running; swan_aisql.stop_embed_server() ends it,
swan-aisql-embed [port] runs it by hand, and connect(embed_server=False) never starts one. Any
OpenAI-compatible embeddings endpoint works instead, text only:
connect(ai_embed_endpoint="https://api.openai.com", ai_embed_model="text-embedding-3-small"). With no
server at all the engine notices on the first request, orders predicates by prompt cost alone from then on,
and every query still runs.
Version coupling. A DuckDB extension loads only into the exact DuckDB build it was compiled for, so each
swan-aisql release pins one duckdb version (this release: the version in the package metadata, a 2.0
pre-release). connect() reports a mismatch with the pip install 'duckdb==...' line that fixes it.
Building a wheel yourself (from the repository checkout, after make release):
pip install build wheel --pre "duckdb==$(sed -n 's/^dependencies = \["duckdb==\([^"]*\)"\]/\1/p' python/pyproject.toml)"
python/build_wheel.sh # packs build/release/extension/aisql/aisql.duckdb_extension
pip install python/dist/swan_aisql-*.whl
The binary must come from the DuckDB commit the pinned duckdb wheel was built from (the duckdb/ submodule
pin); the script checks the binary's footer against the installed engine and refuses any other build.
Releasing (maintainers). .github/workflows/PythonWheels.yml builds the extension for every platform
through the DuckDB distribution pipeline, packs one wheel per platform, smoke-tests each against the pinned
duckdb wheel on its own runner, and on a v* tag publishes them: a tag ending in -test goes to TestPyPI,
any other to PyPI. Publishing uses PyPI trusted publishing (no stored token): register the project
swan-aisql with owner ZhaoFuheng, repository SWAN-AISQL, workflow PythonWheels.yml and environment
pypi on pypi.org (testpypi on test.pypi.org), and create those two environments in the repository
settings. Bumping DuckDB: pin the duckdb/ submodule to the commit the target duckdb wheel reports as
source_id, set the same commit in both workflows and the matching duckdb== version in pyproject.toml.
Metadata
Release files for swan-aisql 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| swan_aisql-0.1.2-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| swan_aisql-0.1.2-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| swan_aisql-0.1.2-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| swan_aisql-0.1.2-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| swan_aisql-0.1.2-py3-none-macosx_10_15_x86_64.whl | Python 3 | none | macOS 10.15+ x86-64 | Details |
Total release size: 77.9 MB
Release files / swan_aisql-0.1.2-py3-none-win_amd64.whl
| Download URL | swan_aisql-0.1.2-py3-none-win_amd64.whl |
|---|---|
| Size | 13.0 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
dd9b9d72bbc2bd44758455bcb52f402e110cfb11640ffe2572ee5d04e996a75b
|
|
BLAKE2b-256 checksum How to use checksums |
f00a5028cf5cbf39d3143e278efe6cfc394318a6354b9cddfa38a99d4c6f6d50
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / swan_aisql-0.1.2-py3-none-manylinux_2_28_x86_64.whl
| Download URL | swan_aisql-0.1.2-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 19.2 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
f762e2e36ddb0d263dcfdc7ec206ee3a68969cbe2083ff073e28318ea1180051
|
|
BLAKE2b-256 checksum How to use checksums |
5faabed043301976b6a2de1f5505df0f9bda6166bf04e6dc43395ab624a4c66a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / swan_aisql-0.1.2-py3-none-manylinux_2_28_aarch64.whl
| Download URL | swan_aisql-0.1.2-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 17.2 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
b522b0779bc1d7071eca2c2607e8bd645a4d82ccaa80333bf41a0ef59042e64b
|
|
BLAKE2b-256 checksum How to use checksums |
3ea52920b2e8cfb5ada704554b1cf9bd533b4c85fa3b6dca928d58e952f11604
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / swan_aisql-0.1.2-py3-none-macosx_11_0_arm64.whl
| Download URL | swan_aisql-0.1.2-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 13.7 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a76ffcc405a192188f9a09f2adb92fdd6ae7a84f5f1b4163f6f2eed10a4a3f48
|
|
BLAKE2b-256 checksum How to use checksums |
c65e328bee0648364f282f020eb5cd5210228205f5a3f4c23d2ad9dcbeb4da66
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / swan_aisql-0.1.2-py3-none-macosx_10_15_x86_64.whl
| Download URL | swan_aisql-0.1.2-py3-none-macosx_10_15_x86_64.whl |
|---|---|
| Size | 14.8 MB |
| Tags | Python 3 macOS 10.15+ x86-64 |
|
SHA-256 checksum How to use checksums |
d32afa8760ec324adbb72be0d9a8263279df544cf3af482847c559a6063c0f4b
|
|
BLAKE2b-256 checksum How to use checksums |
a3df24f441c8768af455de85c84758572284f49b5868a7ae69bf4fd59c7e39d7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logSecurity for swan-aisql 0.1.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 5 files in this release have been uploaded with provenance metadata.
Attestation for swan_aisql-0.1.2-py3-none-win_amd64.whl
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.