Official Python SDK for Skald
Project description
Skald Python SDK
Official Python SDK for Skald.
Installation
pip install skald-sdk
Quick Start
import asyncio
from skald_sdk import Skald
async def main():
# Initialize the client
async with Skald("your-api-key") as skald:
# Create a memo
await skald.create_memo({
"title": "Meeting Notes",
"content": "Discussion about Q1 goals and objectives...",
"metadata": {"priority": "high"},
"tags": ["meeting", "q1"],
"source": "notion"
})
# Search your knowledge base
results = await skald.search({
"query": "quarterly goals",
"limit": 10
})
# Chat with your knowledge
response = await skald.chat({
"query": "What were the main discussion points?"
})
print(response["response"])
asyncio.run(main())
Features
- Full CRUD Operations: Create, read, update, and delete memos
- Semantic Search: Vector-based search for finding relevant content
- AI Chat: Natural language Q&A over your knowledge base
- Document Generation: AI-powered document creation from your memos
- Streaming Support: Real-time streaming for chat and document generation
- Type Safety: Full type hints for better IDE support
- Async/Await: Built on modern async Python patterns
Usage
Creating Memos
# Basic memo
await skald.create_memo({
"title": "Product Requirements",
"content": "We need to build a mobile app with..."
})
# With metadata and tags
await skald.create_memo({
"title": "Technical Spec",
"content": "Architecture overview...",
"metadata": {
"author": "john@example.com",
"version": "1.0"
},
"tags": ["technical", "architecture"],
"source": "confluence",
"reference_id": "TECH-123"
})
Retrieving Memos
# Get by UUID
memo = await skald.get_memo("550e8400-e29b-41d4-a716-446655440000")
# Get by reference ID
memo = await skald.get_memo("TECH-123", id_type="reference_id")
# List with pagination
response = await skald.list_memos({
"page": 1,
"page_size": 50
})
for memo in response["results"]:
print(f"{memo['title']}: {memo['summary']}")
Updating and Deleting Memos
# Update memo
await skald.update_memo(
"550e8400-e29b-41d4-a716-446655440000",
{
"title": "Updated Title",
"content": "Updated content...",
"metadata": {"status": "reviewed"}
}
)
# Delete memo
await skald.delete_memo("550e8400-e29b-41d4-a716-446655440000")
Searching
# Semantic vector search
results = await skald.search({
"query": "machine learning models",
"limit": 10
})
# Text-based search
results = await skald.search({
"query": "python",
"limit": 20
})
# Search with filters
results = await skald.search({
"query": "api documentation",
"limit": 10,
"filters": [
{
"field": "source",
"operator": "eq",
"value": "confluence",
"filter_type": "native_field"
},
{
"field": "category",
"operator": "eq",
"value": "technical",
"filter_type": "custom_metadata"
}
]
})
for result in results["results"]:
print(f"{result['title']}: {result['content_snippet']}")
print(f"Relevance: {result['distance']}")
Chat
# Non-streaming chat
response = await skald.chat({
"query": "What are our main product features?"
})
print(response["response"]) # Includes [[N]] citations
# Streaming chat for real-time responses
async for event in skald.streamed_chat({
"query": "Summarize our technical architecture"
}):
if event["type"] == "token":
print(event["content"], end="", flush=True)
elif event["type"] == "done":
print("\nDone!")
# Chat with filters
response = await skald.chat({
"query": "What did we discuss in recent meetings?",
"filters": [
{
"field": "tags",
"operator": "in",
"value": ["meeting"],
"filter_type": "native_field"
}
]
})
Document Generation
# Generate a complete document
response = await skald.generate_doc({
"prompt": "Create a comprehensive PRD for a mobile app",
"rules": "Use formal language. Include: Overview, Requirements, Timeline, Success Metrics"
})
print(response["response"])
# Streaming document generation
async for event in skald.streamed_generate_doc({
"prompt": "Write a technical specification",
"rules": "Include Architecture, Security, and Testing sections",
"filters": [
{
"field": "tags",
"operator": "in",
"value": ["technical"],
"filter_type": "native_field"
}
]
}):
if event["type"] == "token":
print(event["content"], end="", flush=True)
Search Methods
chunk_vector_search: Semantic search using AI embeddings (best for finding conceptually similar content)title_contains: Case-insensitive substring match in titlestitle_startswith: Case-insensitive prefix match in titles
Filter Types
Native Fields
Filter on built-in memo fields:
title: Memo titlesource: Source system (e.g., "notion", "confluence")client_reference_id: Your external reference IDtags: Memo tags (use withinornot_inoperators)
Custom Metadata
Filter on your custom metadata fields using filter_type: "custom_metadata".
Filter Operators
eq: Equalsneq: Not equalscontains: Contains substring (case-insensitive)startswith: Starts with (case-insensitive)endswith: Ends with (case-insensitive)in: Value in arraynot_in: Value not in array
API Reference
Skald(api_key, base_url="https://api.useskald.com")
Main client class for interacting with Skald.
Methods:
CRUD Operations
async create_memo(memo_data: MemoData) -> CreateMemoResponseasync get_memo(memo_id: str, id_type: IdType = "memo_uuid") -> Memoasync list_memos(params: Optional[ListMemosParams] = None) -> ListMemosResponseasync update_memo(memo_id: str, update_data: UpdateMemoData, id_type: IdType = "memo_uuid") -> UpdateMemoResponseasync delete_memo(memo_id: str, id_type: IdType = "memo_uuid") -> None
Search and Query
async search(search_params: SearchRequest) -> SearchResponseasync chat(chat_params: ChatRequest) -> ChatResponseasync streamed_chat(chat_params: ChatRequest) -> AsyncIterator[ChatStreamEvent]async generate_doc(generate_params: GenerateDocRequest) -> GenerateDocResponseasync streamed_generate_doc(generate_params: GenerateDocRequest) -> AsyncIterator[GenerateDocStreamEvent]
Type Definitions
The SDK includes comprehensive type definitions for all API operations. Import them from skald_sdk.types:
from skald_sdk.types import (
MemoData,
UpdateMemoData,
SearchRequest,
ChatRequest,
Filter,
SearchMethod,
FilterOperator,
FilterType,
)
Error Handling
The SDK raises exceptions for API errors:
try:
memo = await skald.get_memo("invalid-id")
except Exception as e:
print(f"Error: {e}")
# Output: "Skald API error (404): Not Found"
Requirements
- Python 3.8+
- httpx >= 0.24.0
- typing-extensions >= 4.5.0 (for Python < 3.10)
Development
# Install development dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run tests with coverage
pytest --cov=skald_sdk --cov-report=term-missing
# Type checking
mypy skald_sdk
# Format code
black skald_sdk tests
# Lint
ruff check skald_sdk tests
License
MIT
Support
- Documentation: https://docs.useskald.com
- Issues: https://github.com/skald-labs/skald-python/issues
- Email: support@useskald.com
Related
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 skald_sdk-0.2.0.tar.gz.
File metadata
- Download URL: skald_sdk-0.2.0.tar.gz
- Upload date:
- Size: 14.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00782b19a8b01281d179d97ef9e85db2ee0bbf0537639c3e54b5d1d966bc62c7
|
|
| MD5 |
e5f4d332fc4f310bcb515d99b0fd0f62
|
|
| BLAKE2b-256 |
49297ad8eea0d480dbc6bd16f5b38a7d8d6a6bffa70a958ae9125c8d82f385a3
|
File details
Details for the file skald_sdk-0.2.0-py3-none-any.whl.
File metadata
- Download URL: skald_sdk-0.2.0-py3-none-any.whl
- Upload date:
- Size: 10.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
50569494315b1886489210df0b51567f097a68fec9a84d40a87ffef16932414e
|
|
| MD5 |
9b25a686f6ea78cf19d9e65eda38f096
|
|
| BLAKE2b-256 |
90b34d010422d4df0d456545cef53f45ada5364d1759338ecf6228219c7fa442
|