Python SDK
The official Python SDK for the OfSelf API.
Installation
pip install ofself
Requirements:
- Python 3.8+
Quick Start
from ofself import OfSelfClient
# Initialize the client
client = OfSelfClient(api_key="your-api-key")
# Create a node
node = client.nodes.create(
user_id="user-123",
title="My First Note",
value="Hello, OfSelf!",
node_type="note"
)
print(f"Created: {node['id']}")
Configuration
from ofself import OfSelfClient
client = OfSelfClient(
api_key="your-api-key",
base_url="https://api.ofself.ai/api/v1", # Default
timeout=30.0 # Request timeout in seconds
)
Environment Variables
# .env
OFSELF_API_KEY=ofs_key_xxxxxxxxxxxxx
import os
from ofself import OfSelfClient
client = OfSelfClient(api_key=os.environ["OFSELF_API_KEY"])
Resources
Nodes
# Create
node = client.nodes.create(
user_id="user-123",
title="Meeting Notes",
value="Content...",
node_type="note",
tag_ids=["tag_work"]
)
# List
result = client.nodes.list(
user_id="user-123",
node_type="note",
page=1,
per_page=20
)
# Get
node = client.nodes.get(user_id="user-123", node_id="node_abc")
# Update
node = client.nodes.update(
user_id="user-123",
node_id="node_abc",
title="Updated Title"
)
# Delete
client.nodes.delete(user_id="user-123", node_id="node_abc")
# Vector search
results = client.nodes.vector_search(
user_id="user-123",
query="project deadlines",
limit=10
)
Tags
# Create
tag = client.tags.create(
user_id="user-123",
name="Work",
color="#3B82F6"
)
# List
result = client.tags.list(user_id="user-123")
# Get nodes with tag
nodes = client.tags.get_nodes(user_id="user-123", tag_id="tag_work")
# Add tag to node
client.nodes.add_tag(user_id="user-123", node_id="node_abc", tag_id="tag_work")
Files
# Upload
file = client.files.upload(
user_id="user-123",
file="/path/to/document.pdf",
tag_ids=["tag_documents"]
)
# List
result = client.files.list(user_id="user-123")
# Download
content = client.files.download(user_id="user-123", file_id="file_abc")
with open("downloaded.pdf", "wb") as f:
f.write(content)
Proposals
# Create proposal
proposal = client.proposals.create(
user_id="user-123",
proposal_type="create_node",
canonical_data={
"entities": [{
"title": "Imported Note",
"value": "Content",
"node_type": "note"
}]
}
)
# List pending
result = client.proposals.list(user_id="user-123", status="pending")
# Approve (as user)
client.proposals.approve(user_id="user-123", proposal_id="prop_abc")
Graph
# Get snapshot for visualization
graph = client.graph.snapshot(user_id="user-123")
print(f"Nodes: {len(graph['nodes'])}")
print(f"Edges: {len(graph['edges'])}")
Error Handling
from ofself import OfSelfClient
from ofself.exceptions import (
OfSelfError,
AuthenticationError,
PermissionDenied,
NotFoundError,
ValidationError,
RateLimitError,
ServerError,
)
client = OfSelfClient(api_key="your-key")
try:
node = client.nodes.get(user_id="user-123", node_id="invalid")
except AuthenticationError:
print("Invalid API key")
except PermissionDenied:
print("User hasn't authorized your app")
except NotFoundError:
print("Node not found")
except ValidationError as e:
print(f"Validation failed: {e.errors}")
except RateLimitError as e:
print(f"Rate limited. Retry after {e.retry_after}s")
except ServerError:
print("Server error - try again later")
except OfSelfError as e:
print(f"API error: {e}")
Context Manager
with OfSelfClient(api_key="your-key") as client:
nodes = client.nodes.list(user_id="user-123")
# Client is automatically closed
Type Hints
The SDK is fully typed. Use with IDE for autocomplete:
from ofself import OfSelfClient
from ofself.types import Node, Tag, Proposal
client = OfSelfClient(api_key="key")
# IDE knows return types
node: dict = client.nodes.create(...)
Pagination
# Iterate through all pages
page = 1
all_nodes = []
while True:
result = client.nodes.list(
user_id="user-123",
page=page,
per_page=100
)
all_nodes.extend(result['items'])
if not result['has_next']:
break
page += 1