Barrel
Une base de donnees edge-AI embarquable. Un document, ses pieces jointes et son vecteur vivent sous un seul id, ainsi la memoire d'un agent tient en une seule ecriture et une seule lecture.
Un enregistrement, trois formes
Pas de code de liaison entre un stockage documentaire et un index vectoriel separe. C'est un seul enregistrement.
Document
JSON sans schema avec MVCC a vecteurs de version, requetes BQL et un flux de changements.
Blobs
Pieces jointes streamees et adressees par contenu, repliquees sur leur propre flux.
Vecteur
Auto-embarque ou fournissez le votre, interrogeable en vectoriel, BM25 et hybride.
Mode enregistrement
Ecrivez du texte, obtenez un embedding. Une politique embarque les documents automatiquement a l'ecriture.
Requetes BQL
Un dialecte PartiQL sur documents, vecteurs et recherche par mots-cles, avec abonnements en direct.
Timeline
Creez une branche d'une base de donnees, restaurez a un instant precis, et fusionnez les branches.
Chiffrement au repos
AES-256-GCM, cles par base de donnees et un fournisseur de cles enfichable.
Sync et replication
Les vecteurs de version HLC convergent sans coordinateur, en ponctuel ou en continu.
Couche agent
Espaces, jetons de capacite, sessions et transferts via REST et MCP.
Executez-le a votre facon
Embarque
Une bibliotheque dans votre app Erlang ou Elixir. Pas de processus separe.
Serveur
barrel_server expose REST/JSON et MCP sur la meme base de donnees.
Navigateur
barrel-lite synchronise une copie offline-first dans le navigateur.
Demarrage Rapide
%% Open a database; text is auto-embedded into a vector
{ok, _} = barrel:open(<<"notes">>, #{embedding => #{provider => openai}}).
%% One write stores the document, its vector, and its blobs under one id
{ok, _} = barrel:put_doc(<<"notes">>, #{
<<"id">> => <<"n1">>,
<<"title">> => <<"Design review">>,
<<"text">> => <<"Ship the edge sync protocol">>
}).
%% Query with BQL
{ok, Rows, _} = barrel:query(<<"notes">>,
<<"SELECT id, title FROM db WHERE title LIKE 'Design%'">>).
%% Vector search over the same records
{ok, Hits, _} = barrel:query(<<"notes">>,
<<"SELECT id, _score FROM vector_top_k('edge sync', k => 5) AS v">>). # barrel_server place la meme base derriere REST et MCP.
$ curl -X PUT localhost:8080/db/notes
{"ok":true,"db":"notes"}
$ curl -X PUT localhost:8080/db/notes/doc/n1 \
-H 'content-type: application/json' \
-d '{"title":"Design review","text":"Ship the edge sync protocol"}'
{"id":"n1","ok":true,"rev":"0000019f46b4c08900000000@8c0010c983917d4b"}
$ curl localhost:8080/db/notes/doc/n1
{"_rev":"0000019f46b4c08900000000@8c0010c983917d4b","id":"n1","title":"Design review",...}
# Recherche vectorielle sur les memes enregistrements.
$ curl -X POST localhost:8080/db/notes/search/vector \
-H 'content-type: application/json' -d '{"vector":[0.1,0.2,0.3],"k":5}' Quand l'Utiliser
Utilisez Barrel quand :
- + Vous voulez documents, blobs et vecteurs sous un seul id
- + Vous construisez des agents qui ont besoin de memoire et de recherche
- + Vous avez besoin d'un deploiement offline-first ou en edge
- + Vous voulez embarquer la base de donnees, pas gerer un cluster
Considerez des alternatives quand :
- + Vous avez besoin d'un grand cluster distribue
- + Vous etes engage sur un moteur SQL existant unique
- + Vous n'avez besoin que d'une couche (utilisez alors juste cette bibliotheque)