athenadb
athenadb copied to clipboard
🦉⚡️Serverless, distributed vector database as an API
🦉AthenaDB⚡️
Serverless, distributed Vector Database as an API written with Cloudflare Workers, Workers AI, D1, and Vectorize.
AthenaDB is a simple, serverless, distributed vector database that can be used as an API. It is written with Cloudflare Workers AI, D1, Vectorize.
Features
- Simple API Endpoints: AthenaDB provides straightforward endpoints for various database operations, making it accessible for developers of all skill levels.
- Distributed Nature: With data replication across multiple data centers, AthenaDB ensures high availability and resilience.
- Built-In Data Replication: Due to Cloudflare Workers’ underlying architecture, data is replicated across data centers automatically.
- Scalability: AthenaDB is designed to handle large amounts of vector text data, making it suitable for projects with high data volumes.
- Serverless Architecture: With AthenaDB being serverless, you don't have to worry about managing infrastructure, allowing for more focus on development.
Getting Started
- Downloads and install Wrangler.
- Log in to Wrangler with
wrangler login
. AthenaDB requires a $5/month Workers subscription to function. - Run the following commands:
git clone https://github.com/TimeSurgeLabs/athenadb.git
cd athenadb
npm run create-vector
npm run create-db
Copy the output Database ID and paste it in wrangler.toml
under database_id
. Then, run the following two commands:
npm run init-db
npm run deploy
You should get an output with your API URL. You can now use the API endpoints.
API Endpoints
POST /:namespace/insert
Inserts text data into the database. Text is converted into embeddings using Cloudflare AI and stored along with a unique identifier.
-
Request Body:
-
input
: A single string (max 1024 characters). -
inputs
: An array of strings (each max 1024 characters).
-
POST /:namespace/query
Queries the database for similar text embeddings. Specify ?limit=number
in the URL to specify the number of results to return. The default is 5, the maximum is 20.
-
Request Body:
-
input
: A single string for querying. (max 1024 characters) -
inputs
: An array of strings for batch querying. (each max 1024 characters)
-
GET /:namespace/:uuid
Retrieves a specific entry from the database using its unique identifier (UUID). Add query parameters ?vector=true
to retrieve the vector along with the entry. Add query parameters ?db_id=true
to retrieve the SQL table ID along with the entry.
GET /:namespace?limit=10&offset=0
Retrieves all entries from the given namespace. Limit can be set to a maximum of 100 entries. Add query parameters ?vector=true
to retrieve the vectors along with the entries. Add query parameters ?db_id=true
to retrieve the SQL table ID along with the entries.
DELETE /:namespace/:uuid
Deletes a specific entry from the database using its unique identifier (UUID). Warning: This action is irreversible.
DELETE /:namespace
Deletes all entries from the given namespace. Warning: This action is irreversible.
POST /embeddings
Generates embeddings for given text without storing it in the database.
-
Request Body:
-
text
: A string whose embedding is to be generated.
-
GET /
A test endpoint that returns 'Hello world!' as a response.
Usage Examples
Inserting Text
fetch('https://athenadb.yourusername.workers.dev/your-namespace/insert', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ input: 'Your text here' })
})
Querying the Database
fetch('https://athenadb.yourusername.workers.dev/your-namespace/query', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ input: 'Query text' })
})
Retrieving an Entry
fetch('https://athenadb.yourusername.workers.dev/your-namespace/your-uuid', {
method: 'GET'
})
Deleting an Entry
fetch('https://athenadb.yourusername.workers.dev/your-namespace/your-uuid', {
method: 'DELETE'
})
Generating Embeddings
fetch('https://athenadb.yourusername.workers.dev/embeddings', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text: 'Your text here' })
})