AlakazamPortal) gives you the whole /v1 surface from Swift (generate and manage worlds, create talk-to characters, mint runtime sessions) plus a drop-in AI Character component. Requires iOS 15+ (macOS 12+ also supported).
Install
Add the package in Xcode (File → Add Package Dependencies…), or declare it in yourPackage.swift:
Setup
1
Get a key
Start with an
sk_test_… secret key (get one here): it runs a free, mocked sandbox. Swap to sk_live_… when you ship.2
Store it
For prototype/backend use, stash the key in the Keychain with
AlakazamAuth.setApiKey(_:) and construct AlakazamClient() with no arguments: it reads the stored key automatically. Or just pass the key straight through: AlakazamClient(secretKey: "sk_test_…").Programmable worlds & AI characters (/v1)
AlakazamClient is a thin async/await wrapper over the /v1 API. Construct it with your secret key, or pass nothing to reuse the key stored in the Keychain.
A
sk_test_… key returns deterministic mocks, every response carries mock: true, and nothing spends GPU or quota. Build your whole integration for free, then swap to sk_live_…. See Testing.Drop-in AI Character
AlakazamCharacter is a @MainActor ObservableObject that wraps the session → say → speak loop as an NPC you can drop into any SwiftUI view or UIKit screen.
1
Create it
Construct with the
characterId from client.createCharacter(...) (below) and, in a shipped app, a sessionToken minted by your backend:2
Wire it up
Bind
onReply / onError, or observe the @Published var lastReply / isConnected directly from SwiftUI.3
Prototype without a backend
Leave
sessionToken nil and pass a secretKey instead (the component mints one itself for prototyping. In a shipped build, never do this) assign a backend-minted token.autoSpeak on (default) it plays the reply through AVAudioPlayer automatically:
speak(_:) (synthesize + play a line) and showImage(_:) (returns a show_image src). For a public, token-free share link to a public world, use AlakazamClient.publicPlayUrl(slug).
AlakazamClient reference
Every method maps 1:1 to a /v1 endpoint. Typed methods decode into a Codable struct; the raw endpoints return a JSONValue tree.
Optional params:
frameB64 on createWorld / createCharacter (seed creation from a base64
image), cursor on listWorlds / listCharacters (pagination, pass the prior nextCursor),
and ttlSeconds on mintSession (60–3600, omitted when 0). Empty optionals are omitted from the
request body (never sent as ""), so payloads match the Unity/Unreal/Android SDKs.Next steps
Android SDK
The same worlds + AI characters in Kotlin.
Characters
Stances, memory, voice, and images in depth.
The two-token rule
Mint session tokens server-side; never ship a secret key.
Testing sandbox
Build the whole integration free with a test key.

