Magasin de vecteurs Amazon S3
La classe S3Vectors propose une recherche vectorielle à l’aide d’Amazon S3 Vectors (Preview). Elle stocke les vecteurs dans des buckets de vecteurs et effectue des recherches de similarité dans des index vectoriels, avec des filtres de métadonnées fondés sur JSON.
Amazon S3 Vectors est un service Preview. Les fonctionnalités Preview peuvent être modifiées ou supprimées sans préavis et ne sont pas couvertes par les SLA AWS. Son comportement, ses limites et sa disponibilité régionale peuvent changer à tout moment. Cette bibliothèque peut introduire des changements cassants afin de rester alignée sur AWS.
InstallationLien direct vers Installation
- npm
- pnpm
- Yarn
- Bun
npm install @mastra/s3vectors@latest
pnpm add @mastra/s3vectors@latest
yarn add @mastra/s3vectors@latest
bun add @mastra/s3vectors@latest
Exemple d’utilisationLien direct vers Exemple d’utilisation
import { S3Vectors } from '@mastra/s3vectors'
const store = new S3Vectors({
vectorBucketName: process.env.S3_VECTORS_BUCKET_NAME!, // e.g. "my-vector-bucket"
clientConfig: {
region: process.env.AWS_REGION!, // credentials use the default AWS provider chain
},
// Optional: mark large/long-text fields as non-filterable at index creation time
nonFilterableMetadataKeys: ['content'],
})
// Create an index (names are normalized: "_" → "-" and lowercased)
await store.createIndex({
indexName: 'my_index',
dimension: 1536,
metric: 'cosine', // "euclidean" also supported; "dotproduct" is NOT supported
})
// Upsert vectors (ids auto-generated if omitted). Date values in metadata are serialized to epoch ms.
const ids = await store.upsert({
indexName: 'my_index',
vectors: [
[0.1, 0.2 /* … */],
[0.3, 0.4 /* … */],
],
metadata: [
{
text: 'doc1',
genre: 'documentary',
year: 2023,
createdAt: new Date('2024-01-01'),
},
{ text: 'doc2', genre: 'comedy', year: 2021 },
],
})
// Query with metadata filters (implicit AND is canonicalized)
const results = await store.query({
indexName: 'my-index',
queryVector: [0.1, 0.2 /* … */],
topK: 10, // Service-side limits may apply (commonly 30)
filter: { genre: { $in: ['documentary', 'comedy'] }, year: { $gte: 2020 } },
includeVector: false, // set true to include raw vectors (may trigger a secondary fetch)
})
// Clean up resources (closes the underlying HTTP handler)
await store.disconnect()
Options du constructeurLien direct vers Options du constructeur
vectorBucketName:
clientConfig?:
region, credentials).nonFilterableMetadataKeys?:
content.MéthodesLien direct vers Méthodes
createIndex()Lien direct vers createindex
Crée un nouvel index vectoriel dans le bucket de vecteurs configuré. Si l’index existe déjà, l’appel valide le schéma et n’a aucun effet (la métrique et la dimension existantes sont conservées).
indexName:
dimension:
metric?:
dotproduct n’est pas pris en charge par S3 Vectors.upsert()Lien direct vers upsert
Ajoute ou remplace des vecteurs (écriture d’enregistrements complets). Si ids n’est pas fourni, des UUID sont générés.
indexName:
vectors:
metadata?:
ids?:
query()Lien direct vers query
Recherche les voisins les plus proches avec un filtrage facultatif des métadonnées.
indexName:
queryVector:
topK?:
filter?:
$and, $or, $eq, $ne, $gt, $gte, $lt, $lte, $in, $nin, $exists.includeVector?:
Les résultats incluent score = 1/(1 + distance) afin qu’un score plus élevé soit préférable tout en préservant le classement de distance sous-jacent.
describeIndex()Lien direct vers describeindex
Renvoie des informations sur l’index.
indexName:
Renvoie :
interface IndexStats {
dimension: number
count: number // computed via ListVectors pagination (O(n))
metric: 'cosine' | 'euclidean'
}
deleteIndex()Lien direct vers deleteindex
Supprime un index et ses données.
indexName:
listIndexes()Lien direct vers listindexes
Répertorie tous les index du bucket de vecteurs configuré.
Renvoie : Promise<string[]>
updateVector()Lien direct vers updatevector
Met à jour un vecteur ou des métadonnées pour un ID précis dans un index.
indexName:
id:
update:
update.vector?:
update.metadata?:
deleteVector()Lien direct vers deletevector
Supprime un vecteur spécifique par ID.
indexName:
id:
disconnect()Lien direct vers disconnect
Ferme le gestionnaire HTTP AWS SDK sous-jacent afin de libérer les sockets.
Types de réponseLien direct vers Types de réponse
Les résultats de requête sont renvoyés dans ce format :
interface QueryResult {
id: string
score: number // 1/(1 + distance)
metadata: Record<string, any>
vector?: number[] // Only included if includeVector is true
}
Syntaxe des filtresLien direct vers Syntaxe des filtres
S3 Vectors prend en charge un sous-ensemble strict d’opérateurs et de types de valeurs. Le traducteur de filtres Mastra :
- Canonicalise les ET implicites :
{a:1,b:2}→{ $and: [{a:1},{b:2}] }. - Normalise les valeurs Date en ms depuis l’époque pour les comparaisons numériques et les éléments de tableau.
- Interdit Date dans les positions d’égalité (
field: valueou$eq/$ne). Les valeurs d’égalité doivent être de type string | number | boolean. - Rejette null/undefined pour l’égalité. L’égalité de tableaux n’est pas prise en charge (utilisez
$in/$nin). - Seuls
$and/$orsont autorisés comme opérateurs logiques de premier niveau. - Les opérateurs logiques doivent contenir des conditions de champ (et non des opérateurs directs).
Opérateurs pris en charge :
- Logiques :
$and,$or(tableaux non vides) - De base :
$eq,$ne(string | number | boolean) - Numériques :
$gt,$gte,$lt,$lte(number ouDate→ ms depuis l’époque) - Tableau :
$in,$nin(tableaux non vides de string | number | boolean ;Date→ ms depuis l’époque) - Élément :
$exists(boolean)
Non pris en charge / interdits (rejetés) : $not, $nor, $regex, $all, $elemMatch, $size, $text, etc.
Exemples :
// Implicit AND
{ genre: { $in: ["documentary", "comedy"] }, year: { $gte: 2020 } }
// Explicit logicals and ranges
{
$and: [
{ price: { $gte: 100, $lte: 1000 } },
{ $or: [{ stock: { $gt: 0 } }, { preorder: true }] }
]
}
// Dates in range (converted to epoch ms)
{ timestamp: { $gt: new Date("2024-01-01T00:00:00Z") } }
Si vous définissez nonFilterableMetadataKeys lors de la création de l’index, ces clés sont stockées mais ne peuvent pas être utilisées dans les filtres.
Gestion des erreursLien direct vers Gestion des erreurs
Le magasin lève des erreurs typées que vous pouvez intercepter :
try {
await store.query({
indexName: 'index-name',
queryVector: queryVector,
})
} catch (error) {
if (error instanceof VectorStoreError) {
console.log(error.code) // 'connection_failed' | 'invalid_dimension' | etc
console.log(error.details) // Additional error context
}
}
Variables d’environnementLien direct vers Variables d’environnement
Variables d’environnement typiques lors de la configuration de votre application :
S3_VECTORS_BUCKET_NAME: nom de votre bucket de vecteurs S3 (utilisé pour renseignervectorBucketName).AWS_REGION: région AWS du bucket S3 Vectors.- Informations d’identification AWS : via la chaîne de fournisseurs AWS SDK standard (
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_PROFILE, etc.).
Bonnes pratiquesLien direct vers Bonnes pratiques
- Choisissez la métrique (
cosineoueuclidean) qui correspond à votre modèle d’embedding.dotproductn’est pas pris en charge. - Gardez les métadonnées filtrables petites et structurées (string/number/boolean). Stockez les textes volumineux (par exemple,
content) comme non filtrables. - Utilisez des chemins avec des points pour les métadonnées imbriquées et des
$and/$orexplicites pour la logique complexe. - Évitez d’appeler
describeIndex()sur les chemins critiques.countest calculé avecListVectorspaginé (O(n)). - Utilisez
includeVector: trueseulement lorsque vous avez besoin des vecteurs bruts.