Python SDK for Arca - Private data vault for personal AI assistants
Project description
Arca Python SDK
Python SDK for Arca - A private data vault for personal AI assistants.
Overview
Arca provides two main APIs:
- Tables API: Store structured data with SQL-like queries (powered by DuckDB and Parquet)
- Vectors API: Store and search unstructured data semantically (powered by vector embeddings)
Installation
pip install arca-ai-vault
Or install from GitHub:
pip install git+https://github.com/xbora/arca-python-sdk.git
Or install from source:
git clone https://github.com/xbora/arca-python-sdk.git
cd arca-python-sdk
pip install -e .
Quick Start
Authentication
Get your API key from https://arca.build/api-keys
from arca import ArcaTableClient, ArcaVectorClient
# Initialize clients
table_client = ArcaTableClient(user_id="your-api-key")
vector_client = ArcaVectorClient(user_id="your-api-key")
Tables API - Store Structured Data
from arca import ArcaTableClient, TableColumn, SkillMetadata
client = ArcaTableClient(user_id="your-api-key")
# Create a table and insert data
response = client.upsert(
table_name="meals",
columns=[
TableColumn("food", "VARCHAR"),
TableColumn("calories", "INTEGER"),
TableColumn("protein", "DOUBLE")
],
data={
"food": "Grilled Chicken",
"calories": 165,
"protein": 31.0
},
skill=SkillMetadata(
description="Tracks daily meals and nutrition",
examples=["SELECT * FROM meals WHERE calories > 200"]
)
)
# Query data
results = client.query(
table_name="meals",
filters={"daysAgo": 7},
order_by="calories DESC",
limit=10
)
# List all tables
tables = client.list_tables()
# Get table schemas
schemas = client.get_schemas()
Vectors API - Semantic Search
from arca import ArcaVectorClient, VectorSkillMetadata, MetadataField
client = ArcaVectorClient(user_id="your-api-key")
# Add entries with automatic embedding generation
response = client.add(
table_name="journal_entries",
text="Today was incredibly productive. Finished the big project ahead of schedule.",
metadata={
"category": "personal",
"mood": "positive",
"date": "2024-01-15"
},
skill=VectorSkillMetadata(
description="Personal journal entries with mood tracking",
metadata_fields=[
MetadataField("category", "string", "Entry category", ["personal", "work", "health"]),
MetadataField("mood", "string", "Emotional state", ["positive", "neutral", "negative"])
],
search_examples=["Find days when I felt accomplished"],
filter_examples=["category = 'personal' AND mood = 'positive'"]
)
)
# Search semantically
results = client.search(
table_name="journal_entries",
query="productive and successful days",
limit=5,
filter="category = 'personal'"
)
# List all vector tables
tables = client.list_tables()
Combined Skills - Get All Skills at Once
from arca import get_all_skills
# Fetch all skills (both table and vector) in one API call
all_skills = get_all_skills(user_id="your-api-key")
# Returns:
# {
# "success": true,
# "userId": "user_01...",
# "skills": [
# {"tableName": "favorites", "skill": "...", "type": "vector", "success": true},
# {"tableName": "meals", "skill": "...", "type": "table", "success": true}
# ],
# "tableSkillCount": 2,
# "vectorSkillCount": 1
# }
print(f"Total skills: {len(all_skills['skills'])}")
print(f"Tables: {all_skills['tableSkillCount']}, Vectors: {all_skills['vectorSkillCount']}")
# Filter by type if needed
table_skills = [s for s in all_skills['skills'] if s['type'] == 'table']
vector_skills = [s for s in all_skills['skills'] if s['type'] == 'vector']
This is especially useful for AI assistants that need complete context about all available data sources.
API Reference
ArcaTableClient
__init__(user_id: str, base_url: str = "https://arca.build")
Initialize the table client with your API key.
upsert(table_name, data, columns=None, skill=None)
Create or append to a table. This is the recommended method for inserting data.
Parameters:
table_name(str): Name of the tabledata(dict): Dictionary of data to insertcolumns(list[TableColumn], optional): Column definitions (required on first insert)skill(SkillMetadata, optional): Metadata to help AI understand the table
query(table_name, query=None, filters=None, limit=None, offset=None, order_by=None, select=None, group_by=None, having=None)
Query a table with filters and aggregations.
Parameters:
table_name(str): Name of the table to queryquery(str, optional): Raw SQL WHERE clause for comparisons (e.g.,"calories > 500","protein > 20 AND carbs < 50")filters(dict, optional): Dictionary of filters (e.g.,{"daysAgo": 7})limit(int, optional): Maximum number of resultsoffset(int, optional): Number of results to skiporder_by(str, optional): Column to order by (e.g.,"created_at DESC")select(list[str], optional): List of columns to selectgroup_by(str, optional): Column to group byhaving(str, optional): HAVING clause for aggregations
Examples:
# Query with comparison operators
results = client.query(
table_name="meals",
query="calories > 500",
order_by="calories DESC"
)
# Query with time-based filters
results = client.query(
table_name="meals",
filters={"daysAgo": 7},
limit=10
)
# Combine custom WHERE clause with other filters
results = client.query(
table_name="meals",
query="protein > 20",
filters={"daysAgo": 30},
limit=5
)
update(table_name, data, where=None)
Update rows in a table.
Parameters:
table_name(str): Name of the tabledata(dict): Dictionary of column:value pairs to updatewhere(dict, optional): Dictionary specifying which rows to update (e.g.,{"id": 5})
Examples:
# Update specific row by ID
result = client.update(
table_name="meals",
data={"calories": 910, "meal_type": "dinner"},
where={"id": 5}
)
# Update row by exact column match
result = client.update(
table_name="meals",
data={"calories": 170},
where={"food": "Grilled Chicken Breast"}
)
delete(table_name)
Delete an entire table.
list_tables()
List all tables for the authenticated user.
get_schemas()
Get schemas for all tables.
get_skill(table_name)
Get the SKILL.md file for a specific table.
update_skill(table_name, skill)
Update the SKILL.md file for a table.
get_all_skills()
Get all table skills in one request.
export(table_name)
Export a table as a Parquet file (returns bytes).
ArcaVectorClient
__init__(user_id: str, base_url: str = "https://arca.build")
Initialize the vector client with your API key.
add(table_name, text, metadata=None, generate_embedding=True, embedding=None, skill=None)
Add a vector entry with automatic embedding generation.
Parameters:
table_name(str): Name of the vector tabletext(str): Text content to embed and storemetadata(dict, optional): Optional metadata dictionarygenerate_embedding(bool): Whether to auto-generate embedding (default: True)embedding(list[float], optional): Pre-computed embedding vectorskill(VectorSkillMetadata, optional): Metadata to help AI understand the table
search(table_name, query, limit=5, generate_embedding=True, embedding=None, filter=None)
Search vectors semantically.
Parameters:
table_name(str): Name of the vector table to searchquery(str): Search query textlimit(int): Maximum number of results (default: 5)generate_embedding(bool): Whether to auto-generate query embedding (default: True)embedding(list[float], optional): Pre-computed query embedding vectorfilter(str, optional): SQL-like filter expression (e.g.,"category = 'personal'")
delete(table_name)
Delete an entire vector table.
list_tables()
List all vector tables for the authenticated user.
get_skill(table_name)
Get the SKILL.md file for a specific vector table.
update_skill(table_name, skill)
Update the SKILL.md file for a vector table.
get_all_skills()
Get all vector skills in one request.
export(table_name)
Export a vector table as a CSV file (returns bytes).
get_all_skills()
get_all_skills(user_id: str, base_url: str = "https://arca.build")
Get all skills (both table and vector) in one request. This is a standalone function (not a client method).
Parameters:
user_id(str): Your Arca API keybase_url(str): Base URL for Arca API (default: "https://arca.build")
Returns:
Dictionary with success, userId, skills array (each skill has tableName, skill, type, success), tableSkillCount, and vectorSkillCount.
Example:
from arca import get_all_skills
all_skills = get_all_skills(user_id="your-api-key")
# Access skills: all_skills['skills']
# Each skill has: tableName, skill, type ('table' or 'vector'), success
Data Models
TableColumn
Represents a column in an Arca table.
TableColumn(name: str, type: str, nullable: bool = True)
Supported types: VARCHAR, INTEGER, BIGINT, DOUBLE, BOOLEAN, TIMESTAMP, DATE, JSON
SkillMetadata
Metadata for table skills - helps AI understand how to use the table.
SkillMetadata(
description: str = None,
examples: list[str] = None,
relationships: list[str] = None,
notes: str = None
)
VectorSkillMetadata
Metadata for vector skills - helps AI understand how to search the vector table.
VectorSkillMetadata(
description: str = None,
metadata_fields: list[MetadataField] = None,
search_examples: list[str] = None,
filter_examples: list[str] = None,
notes: str = None
)
MetadataField
Metadata field definition for vector tables.
MetadataField(
name: str,
type: str,
description: str,
examples: list[str] = None
)
Error Handling
The SDK provides custom exceptions for different error scenarios:
from arca import ArcaAPIError, ArcaAuthError, ArcaValidationError
try:
response = client.query(table_name="meals")
except ArcaAuthError as e:
print(f"Authentication failed: {e}")
except ArcaAPIError as e:
print(f"API error: {e.message} (status: {e.status_code})")
except ArcaValidationError as e:
print(f"Validation error: {e}")
Examples
See the examples/ directory for more comprehensive examples:
table_examples.py- Tables API usage examplesvector_examples.py- Vectors API usage examples
Development
Install development dependencies:
pip install -e ".[dev]"
Run tests:
pytest
License
MIT License
Links
Project details
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 arca_ai_vault-0.2.0.tar.gz.
File metadata
- Download URL: arca_ai_vault-0.2.0.tar.gz
- Upload date:
- Size: 13.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5be1afa97680df4e7c9df915a3b738902450c75203ebb8b23434004a473ce862
|
|
| MD5 |
7d057f1d5c5020b07d7f2acb6a8ac1ae
|
|
| BLAKE2b-256 |
81659e7780788184f6adff93a9e043afdb82b352445cca44879b46f8df81e240
|
File details
Details for the file arca_ai_vault-0.2.0-py3-none-any.whl.
File metadata
- Download URL: arca_ai_vault-0.2.0-py3-none-any.whl
- Upload date:
- Size: 11.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f7ee1cc4e1379553e79da0bc46ead78847249b9dcf6311231cdc21417a216f9
|
|
| MD5 |
cff9f563beec405d5aefadd6ee907a8d
|
|
| BLAKE2b-256 |
50ff4de442992a0cd4fb305cc9b649ee91defd90ab4c1cef4c115151f6a4080e
|