Docs Swift SDK

Swift SDK

SwiftlyAIClient — iOS, macOS, tvOS, watchOS, visionOS

Installation

Add SwiftlyAIClient to your Swift Package Manager dependencies:

// Package.swift
dependencies: [
    .package(
        url: "https://github.com/Swiftly-Developed/SwiftlyAI-Workspace.git",
        from: "1.0.0"
    )
]

// Add to your target
targets: [
    .target(
        name: "YourApp",
        dependencies: [
            .product(name: "SwiftlyAIClient", package: "SwiftlyAI-Workspace")
        ]
    )
]

GitHub: Swiftly-Developed/SwiftlyAI-Workspace

Quick Start

import SwiftlyAIClient

// Initialize the client
let client = try SwiftlyClient(apiKey: "sa_your_api_key")

// Send a chat message
let response = try await client.chat(
    model: "claude-sonnet-4-5-20250929",
    messages: [ChatMessage(role: .user, content: "Hello!")]
)
print(response.message)

Chat

Send a chat completion request and receive a full response:

let response = try await client.chat(
    model: "claude-sonnet-4-5-20250929",
    messages: [
        ChatMessage(role: .system, content: "You are a helpful assistant."),
        ChatMessage(role: .user, content: "Explain quantum computing")
    ]
)

print(response.message)     // The response text
print(response.model)       // Model used
print(response.usage)       // Token usage info

Streaming

Stream responses in real-time using AsyncSequence:

for try await chunk in client.streamChat(
    model: "claude-sonnet-4-5-20250929",
    messages: [ChatMessage(role: .user, content: "Tell me a story")]
) {
    print(chunk.message, terminator: "")
}

Image Generation

Generate images from text prompts:

let image = try await client.generateImage(
    prompt: "A sunset over the mountains",
    model: "dall-e-3"
)

print(image.url)  // Generated image URL

Token Counting

Count tokens before sending a request:

let count = try await client.countTokens(
    model: "claude-sonnet-4-5-20250929",
    messages: [ChatMessage(role: .user, content: "Hello!")]
)

print(count.totalTokens)

Available Models

List all available models from every provider:

let models = try await client.getModels()

for provider in models.providers {
    print("\\(provider.name): \\(provider.models.count) models")
}

Error Handling

Handle errors with typed error responses:

do {
    let response = try await client.chat(
        model: "claude-sonnet-4-5-20250929",
        messages: [ChatMessage(role: .user, content: "Hello")]
    )
} catch let error as SwiftlyClientError {
    print("Error: \\(error.message)")
    print("Code: \\(error.code)")

    if error.isRetryable {
        // Retry after delay
    }
    if error.isBillingError {
        // Show upgrade prompt
    }
}

Quota Tracking

Monitor your usage quota from response headers:

// After any API call, quota info is available
if let quota = client.currentQuota {
    print("Used: \\(quota.requestsUsed) / \\(quota.requestsLimit)")
    print("Usage: \\(quota.usagePercent)%")

    if quota.isApproachingLimit {
        // Show warning to user
    }
}