Aller au contenu

IA et agents

Rebase fournit quatre éléments distincts pour les assistants IA, et ils répondent à des problèmes différents. Il est utile de savoir lequel vous utilisez :

Ce que c’est Qui le consomme
Serveur MCP Un serveur Model Context Protocol stdio doté de 42 outils couvrant votre schéma, vos données, vos utilisateurs, votre stockage, vos crons et votre serveur de développement Un assistant, au moment de l’exécution
Compétences d’agent 21 fichiers de compétences Markdown écrits dans votre dépôt par rebase skills install Un assistant, comme documentation de référence
Fichiers d’instructions ai-instructions.md ainsi que des fichiers de pointeurs spécifiques à chaque assistant, générés par rebase init Un assistant, comme règles permanentes
Clés d’API Identifiants machine qui détiennent des portées, par collection et par opération Tout ce qui appelle l’API HTTP

Les trois premiers visent à fournir à un assistant des connaissances et des outils. Le quatrième est le seul qui détermine ce qu’il est réellement autorisé à faire.

Ce qui compte vraiment : ce à quoi un agent peut toucher

Section intitulée « Ce qui compte vraiment : ce à quoi un agent peut toucher »

Un agent disposant d’outils sur votre base de données est un appelant d’API ordinaire qui se trouve décider de sa propre requête suivante. Rebase n’essaie pas de le contraindre avec des instructions — un prompt n’est pas un mécanisme de contrôle d’accès, et un agent qui lit vos lignes lit du texte que quelqu’un d’autre a pu écrire. La contrainte doit résider en dessous de l’agent, dans les identifiants qu’il transporte.

Rebase attribue à cet identifiant deux barrières indépendantes :

  1. Les portées de la clé. Déclarées par opération et, si vous le souhaitez, par collection : data:read:articles, data:write:articles. data:delete est séparée de data:write ; c’est généralement celle que vous souhaitez refuser à un agent par ailleurs autorisé à modifier.
  2. La sécurité au niveau des lignes (RLS). Les clés d’API ne contournent pas la RLS. Une clé se connecte sous le rôle Postgres rebase_user comme n’importe quel autre appelant, de sorte que vos politiques déterminent toujours quelles lignes sont renvoyées.

Les deux doivent autoriser une requête. L’une ne remplace pas l’autre, et la seconde est la raison pour laquelle une clé qui détient data:read sur toutes les collections peut toujours renvoyer un ensemble de résultats vide.

Un piège classique : access: "public" sur une collection élargit les lignes qu’un appelant peut voir, et non qui peut appeler. C’est une déclaration sur la visibilité des lignes, pas sur l’authentification. L’accorder ne donne aucune portée à une clé, et le refuser n’en bloque aucune.

Le fonctionnement détaillé — création de clés, choix des portées, rotation, expiration, limites de débit — est couvert dans Clés d’API. Ne sautez pas Règles de sécurité (RLS) au passage ; la deuxième barrière n’est efficace que si les politiques que vous avez écrites le sont.

Rebase intègre un type de propriété natif vector sur Postgres et une méthode de requête .vectorSearch() prenant en charge les distances cosine, l2 et inner_product. Cela est déjà documenté, à deux endroits différents :

Trois choses à savoir avant de concevoir votre application autour de cette fonctionnalité. Rebase stocke et cherche des embeddings ; il ne les calcule pas — il n’y a aucun fournisseur d’embeddings, paramètre de modèle ou clé d’API au sein de Rebase, la génération des vecteurs est donc de votre ressort. pgvector est un prérequis, et son installation est facultative. database({ extensions: ["vector"] }) dans config/resources.ts permet à rebase db push et à la vérification du schéma au démarrage d’exécuter CREATE EXTENSION IF NOT EXISTS vector pour vous ; sans cela, ils créent la colonne et vous laissent gérer l’extension. Dans les deux cas, le serveur nécessite une image contenant la bibliothèque et un rôle autorisé à l’installer. Et chaque colonne vectorielle reçoit un index HNSW pour la distance cosinus, car le cosinus est ce que vectorSearch mesure sauf si vous spécifiez distance — un index ne dessert qu’un seul opérateur. Ajustez-le, ou désactivez-le, au niveau de la propriété : voir L’index.

Il n’est pas non plus possible de s’abonner aux requêtes vectorielles ; .vectorSearch(...).listen() est refusé avec l’erreur VECTOR_SEARCH_NOT_LIVE.

Pour la recherche lexicale — recherche en texte intégral classée sur les champs que vous spécifiez, y compris le contenu JSONB et les tableaux — consultez Recherche. Il s’agit d’un mécanisme distinct et les deux n’interagissent pas.