MemoryKit

Swift SDK

Official Swift SDK for MemoryKit. iOS, macOS, watchOS, tvOS.

Zero deps

Built on Foundation/URLSession. No SPM dependencies.

async/await

Every method is async throws. Native Swift concurrency.

globeMulti-platform

iOS 15+, macOS 12+, watchOS 8+, tvOS 15+.

Installation

Add via Swift Package Manager in Package.swift:

dependencies: [
    .package(url: "https://github.com/MemoryKitIO/MemoryKit-Swift-SDK.git", from: "0.1.0")
]

Or in Xcode: File → Add Package Dependencies → paste the URL above.

Quick start

Import and initialize

import MemoryKit
 
let mk = MemoryKit(apiKey: "ctx_...")

Store a memory

let memory = try await mk.memories.create(
    content: "User prefers dark mode and metric units.",
    tags: ["preferences"],
    userId: "user_123"
)
let results = try await mk.memories.search(
    query: "What does the user prefer?",
    limit: 5
)
for hit in results.results {
    print("[\(String(format: "%.2f", hit.score ?? 0))] \(hit.content)")
}

Configuration options

let mk = MemoryKit(
    apiKey: "ctx_...",
    baseURL: URL(string: "https://api.memorykit.io/v1")!,
    timeout: 30,      // seconds
    maxRetries: 3      // automatic retries on 429/5xx
)

Memories

Create and manage

// Create
let memory = try await mk.memories.create(
    content: "Meeting notes from Q4 planning...",
    title: "Q4 Planning",
    tags: ["meetings", "q4"],
    userId: "user_123"
)
 
// List with pagination
let page = try await mk.memories.list(limit: 20, status: "completed")
for mem in page.data {
    print(mem.title ?? mem.id)
}
if page.hasMore, let cursor = page.cursor {
    let next = try await mk.memories.list(cursor: cursor)
}
 
// Get by ID
let mem = try await mk.memories.get("mem_abc123")
 
// Update
try await mk.memories.update("mem_abc123", title: "Updated Title")
 
// Delete
try await mk.memories.delete("mem_abc123")

Upload files

Supports PDF, DOCX, XLSX, PPTX, TXT, CSV, Markdown, HTML, and JSON.

let pdfData = try Data(contentsOf: pdfURL)
let uploaded = try await mk.memories.upload(
    fileData: pdfData,
    fileName: "report.pdf",
    mimeType: "application/pdf",
    title: "Q4 Report"
)

Batch ingest

Up to 100 memories in a single request.

let result = try await mk.memories.batchCreate(
    items: [
        BatchMemoryItem(content: "First fact", tags: ["facts"]),
        BatchMemoryItem(content: "Second fact", tags: ["facts"]),
    ]
)

Reprocess

Triggers re-chunking and re-embedding for an existing memory.

try await mk.memories.reprocess("mem_abc123")

Search

Combines vector similarity, full-text search, and reranking.

let results = try await mk.memories.search(
    query: "quarterly revenue targets",
    limit: 10
)
for hit in results.results {
    print("[\(String(format: "%.2f", hit.score ?? 0))] \(hit.title ?? hit.id)")
}

RAG query

Coming Soonmemories.query() is not available in the current SDK release. Use memories.search() for retrieval. LLM-powered query with answer generation will be available in a future release.

Streaming

Coming Soonmemories.stream() is not available in the current SDK release. Use memories.search() for retrieval. Streaming responses will be available in a future release.

Chats

Coming Soon — Chat methods (chats.create(), chats.sendMessage(), chats.streamMessage(), chats.getHistory()) are not available in the current SDK release. Conversational RAG with chat sessions will be available in a future release.

Users

// Upsert (create or update)
try await mk.users.upsert(
    id: "user_123",
    name: "Alice",
    email: "alice@example.com",
    metadata: ["plan": "pro"]
)
 
// Track events
try await mk.users.createEvent(
    "user_123",
    type: "page_view",
    data: ["page": "/settings"]
)
 
// GDPR erasure — delete user and all associated data
try await mk.users.delete("user_123", cascade: true)

Webhooks

// Subscribe to events
let webhook = try await mk.webhooks.create(
    url: "https://example.com/webhook",
    events: ["memory.completed", "memory.failed"]
)
print("Signing secret:", webhook.secret ?? "")
 
// Test delivery
let test = try await mk.webhooks.test(webhook.id)
print("Delivered:", test.success)

Error handling

All errors are MemoryKitError with convenience properties for common checks:

do {
    let result = try await mk.memories.search(query: "...")
    for hit in result.results { print(hit.content) }
} catch let error as MemoryKitError {
    if error.isAuthError {
        // 401 — invalid or expired API key
    } else if error.isRateLimited {
        // 429 — automatically retried, raised if max retries exceeded
    } else if error.isNotFound {
        // 404
    } else if error.isValidationError {
        // 400/422 — bad request parameters
    } else {
        print("Error:", error.localizedDescription)
    }
} catch {
    print("Network error:", error.localizedDescription)
}

Retryable errors (429, 5xx) are automatically retried with exponential backoff up to maxRetries times. You don't need to implement retry logic yourself.

Never embed API keys directly in your app binary. Use a backend proxy or fetch keys from a secure keychain. See Authentication for best practices.

Edit on GitHub

On this page