Adds pgvector support to TortoiseORM.
Project description
Tortoise Embeddings
Tortoise Embeddings adds pgvector support to TortoiseORM, enabling efficient vector storage and similarity search in PostgreSQL.
Features
- Four Vector Field Types:
VectorField: Supportsvectortype.HalfVectorField: Supportshalfvectype.BinaryVector: Supportsbittype.SparseVector: Supportssparsevectype.
- Aerich Migration Support: Automatically includes vector-based types from your models into the migration scripts.
- Similarity Operations:
- Custom Functions:
L2Distance,CosineDistance,InnerProduct,L1Distance,HammingDistance,JaccardDistance. - Custom Filters: Convenient filter suffixes -
__l2,__cosine,__inner,__l1,__hamming, and__jaccard.
- Custom Functions:
- Works with
numpyarrays and standard Python types.
Installation
pip install tortoise-embeddings
Make sure you have pgvector installed in your PostgreSQL database.
Usage
Define Your Models
from tortoise.models import Model
from tortoise.fields import IntField
from tortoise_embeddings import VectorField, HalfVectorField, BinaryVectorField, SparseVectorField
class Item(Model):
id = IntField(primary_key=True)
# Define a vector field with 3 dimensions
embedding = VectorField(dimensions=3)
# Support for other pgvector types
half_embedding = HalfVectorField(dimensions=3)
binary_embedding = BinaryVectorField(dimensions=4)
sparse_embedding = SparseVectorField(dimensions=3)
Initialize with Custom Client
To enable binary codecs and migration support, use the provided AsyncpgDBClient:
from tortoise import Tortoise
import tortoise.backends.asyncpg
from tortoise_embeddings import VectorAsyncpgDBClient
# Override the client class for the asyncpg backend
tortoise.backends.asyncpg.client_class = VectorAsyncpgDBClient
async def init():
await Tortoise.init(
db_url='postgres://user:pass@host:port/db',
modules={'models': ['your_models_module']}
)
await Tortoise.generate_schemas()
Similarity Search
Using Custom Filters (Recommended)
import numpy
target_vector = numpy.array([1.0, 0.0, 0.0])
# Find items where L2 distance is less than 0.5
items = await Item.filter(embedding__l2=(target_vector, 0.5))
# Find items where Cosine distance is less than 0.1
items = await Item.filter(embedding__cosine=(target_vector, 0.1))
Using Custom Functions
from tortoise_embeddings.similarity import L2Distance
target_vector = [1.0, 0.0, 0.0]
# Annotate results with distance and order by it
items = await Item.all().annotate(
dist=L2Distance(Item._meta.fields_map['embedding'], target_vector, alias="dist")
).order_by("dist")
for item in items:
print(f"Item {item.id} has distance {item.dist}")
Aerich Migrations
If you use aerich, simply use the AerichVectorPostgresDDL to ensure the vector extension is created:
# In your project configuration
from tortoise_embeddings import AerichVectorPostgresDDL
# This is usually handled automatically if you use the VectorAsyncpgDBClient
Development setup
Set the following environment variables:
| Variable | Description | How to get? |
|---|---|---|
| PSQL_CONNECTION_STRING | A connection string to a PostgreSQL database. | postgres://user:password@host:port/database |
| GEMINI_API_KEY | An API key to Google GenAI. (optional) | Go to aistudio.google.com and create an API key. |
Dependencies
- tortoise-orm>=0.25.0,<1.0.0
- aerich>=0.9.0
- asyncpg>=0.31.0
- pgvector>=0.4.0
- numpy>=2.4.0
Running Tests
Tests require a PostgreSQL database with the pgvector extension.
export PSQL_CONNECTION_STRING="postgres://user:password@host:port/database"
export GEMINI_API_KEY="your_api_key" # Optional for Gemini integration tests
pytest tests/
Publishing
Execute the following command to generate the distributable files.
python -m build
License
Copyright 2026 Kotz
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
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 tortoise_embeddings-1.0.0.tar.gz.
File metadata
- Download URL: tortoise_embeddings-1.0.0.tar.gz
- Upload date:
- Size: 27.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ad160e01bda5d12dd6d2226fd8aa1d6eb07402be80214b181983139c5566d38c
|
|
| MD5 |
4ab29d562bd0ce98bf0269a7ed29f134
|
|
| BLAKE2b-256 |
0a3c98fe65fffdad27d8e7bb7f0a8876c2f760b3d25abbb6271583b3af6afc48
|
Provenance
The following attestation bundles were made for tortoise_embeddings-1.0.0.tar.gz:
Publisher:
release.yml on Kaoticz/tortoise-embeddings
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tortoise_embeddings-1.0.0.tar.gz -
Subject digest:
ad160e01bda5d12dd6d2226fd8aa1d6eb07402be80214b181983139c5566d38c - Sigstore transparency entry: 1239454139
- Sigstore integration time:
-
Permalink:
Kaoticz/tortoise-embeddings@764bab6ba50a2f2dccb0d6c18401c928ecd2aad6 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/Kaoticz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@764bab6ba50a2f2dccb0d6c18401c928ecd2aad6 -
Trigger Event:
release
-
Statement type:
File details
Details for the file tortoise_embeddings-1.0.0-py3-none-any.whl.
File metadata
- Download URL: tortoise_embeddings-1.0.0-py3-none-any.whl
- Upload date:
- Size: 19.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6dfd73334e5e6024193a8f89be6e955c5e1c1acf420708be30f09c13e0314f16
|
|
| MD5 |
651e75e1a46412689da635fc0c514cbb
|
|
| BLAKE2b-256 |
426375e921413757c331b552daf33f9675192b07e91600d57992c7eccf1b4aac
|
Provenance
The following attestation bundles were made for tortoise_embeddings-1.0.0-py3-none-any.whl:
Publisher:
release.yml on Kaoticz/tortoise-embeddings
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tortoise_embeddings-1.0.0-py3-none-any.whl -
Subject digest:
6dfd73334e5e6024193a8f89be6e955c5e1c1acf420708be30f09c13e0314f16 - Sigstore transparency entry: 1239454140
- Sigstore integration time:
-
Permalink:
Kaoticz/tortoise-embeddings@764bab6ba50a2f2dccb0d6c18401c928ecd2aad6 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/Kaoticz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@764bab6ba50a2f2dccb0d6c18401c928ecd2aad6 -
Trigger Event:
release
-
Statement type: