Skip to main content

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",
            "search_method": "chunk_vector_search",
            "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",
    "search_method": "chunk_vector_search",
    "limit": 10
})

# Text-based search
results = await skald.search({
    "query": "python",
    "search_method": "title_contains",
    "limit": 20
})

# Search with filters
results = await skald.search({
    "query": "api documentation",
    "search_method": "chunk_vector_search",
    "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 titles
  • title_startswith: Case-insensitive prefix match in titles

Filter Types

Native Fields

Filter on built-in memo fields:

  • title: Memo title
  • source: Source system (e.g., "notion", "confluence")
  • client_reference_id: Your external reference ID
  • tags: Memo tags (use with in or not_in operators)

Custom Metadata

Filter on your custom metadata fields using filter_type: "custom_metadata".

Filter Operators

  • eq: Equals
  • neq: Not equals
  • contains: Contains substring (case-insensitive)
  • startswith: Starts with (case-insensitive)
  • endswith: Ends with (case-insensitive)
  • in: Value in array
  • not_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) -> CreateMemoResponse
  • async get_memo(memo_id: str, id_type: IdType = "memo_uuid") -> Memo
  • async list_memos(params: Optional[ListMemosParams] = None) -> ListMemosResponse
  • async update_memo(memo_id: str, update_data: UpdateMemoData, id_type: IdType = "memo_uuid") -> UpdateMemoResponse
  • async delete_memo(memo_id: str, id_type: IdType = "memo_uuid") -> None

Search and Query

  • async search(search_params: SearchRequest) -> SearchResponse
  • async chat(chat_params: ChatRequest) -> ChatResponse
  • async streamed_chat(chat_params: ChatRequest) -> AsyncIterator[ChatStreamEvent]
  • async generate_doc(generate_params: GenerateDocRequest) -> GenerateDocResponse
  • async 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

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

skald_sdk-0.1.0.tar.gz (15.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

skald_sdk-0.1.0-py3-none-any.whl (10.5 kB view details)

Uploaded Python 3

File details

Details for the file skald_sdk-0.1.0.tar.gz.

File metadata

  • Download URL: skald_sdk-0.1.0.tar.gz
  • Upload date:
  • Size: 15.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.10

File hashes

Hashes for skald_sdk-0.1.0.tar.gz
Algorithm Hash digest
SHA256 fc2f20db345f36ff43f072c0f620f5580d640c92fa25fac276c4bf6379f21aad
MD5 de142cdee74e612e48ace55391f02bae
BLAKE2b-256 20644753d1533439d26de50b3f860e42dc50f0f50b8751a62eb4f67de090280e

See more details on using hashes here.

File details

Details for the file skald_sdk-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: skald_sdk-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 10.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.10

File hashes

Hashes for skald_sdk-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f2b0514bf0394ed853bc8adff5b1e1f3472ed923e50dc031bd25ab52fd4e46a7
MD5 9938491077191d5d78550b03a96f0bc5
BLAKE2b-256 0e0d9a190b42f88eba5c2b5602ae6b45a713b545b2372deb6efaa4b813b525f0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page