Python SDK for Arca - A private data vault for personal AI assistants.
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)
pip install arca-ai-vaultOr install from GitHub:
pip install git+https://github.com/xbora/arca-python-sdk.gitOr install from source:
git clone https://github.com/xbora/arca-python-sdk.git
cd arca-python-sdk
pip install -e .Get your API key from https://arca.build
from arca import ArcaTableClient, ArcaVectorClient
# Initialize clients
table_client = ArcaTableClient(user_id="your-api-key")
vector_client = ArcaVectorClient(user_id="your-api-key")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()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()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.
Initialize the table client with your API key.
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 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 an entire table.
List all tables for the authenticated user.
Get schemas for all tables.
Get the SKILL.md file for a specific table.
Update the SKILL.md file for a table.
Get all table skills in one request.
Export a table as a Parquet file (returns bytes).
Initialize the vector client with your API key.
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 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 an entire vector table.
List all vector tables for the authenticated user.
Get the SKILL.md file for a specific vector table.
Update the SKILL.md file for a vector table.
Get all vector skills in one request.
Export a vector table as a CSV file (returns bytes).
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'), successRepresents a column in an Arca table.
TableColumn(name: str, type: str, nullable: bool = True)Supported types: VARCHAR, INTEGER, BIGINT, DOUBLE, BOOLEAN, TIMESTAMP, DATE, JSON
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
)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
)Metadata field definition for vector tables.
MetadataField(
name: str,
type: str,
description: str,
examples: list[str] = None
)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}")See the examples/ directory for more comprehensive examples:
table_examples.py- Tables API usage examplesvector_examples.py- Vectors API usage examples
Install development dependencies:
pip install -e ".[dev]"Run tests:
pytestMIT License