Client and integration
PrimordialClient is the SDK entry point. Copies share the same coordinated runtime.
Declarations
// PrimordialClient
init(
aiConfiguration: PrimordialAIConfiguration? = nil,
configuration: PrimordialConfiguration = .init(),
identifier: String = "default"
)
let identifier: String
let configuration: PrimordialConfiguration
let aiConfiguration: PrimordialAIConfiguration
var ai: PrimordialAI { get }
var advanced: PrimordialAdvanced { get }
func integrationStatus() throws -> PrimordialIntegrationStatus
// Global
func checkIntegration() throws -> PrimordialIntegrationStatus
Types
PrimordialConfiguration
activationConfiguration: PrimordialActivationConfigurationinit(activationConfiguration:)
PrimordialIntegrationStatus
sdkVersion: Stringplatform: PrimordialPlatformisSimulator: Bool
PrimordialPlatform
.iOS.macOS.unsupported
PrimordialError
.unsupportedDistributionerrorDescription
Activation
Declarations
// PrimordialClient
@discardableResult
func activate(
_ credential: PrimordialActivationCredential,
feature: PrimordialActivationFeature = .runtime
) async throws -> PrimordialActivationStatus
var isActivated: Bool { get }
func activationStatus() -> PrimordialActivationStatus
// Global
@discardableResult
func activate(
_ credential: PrimordialActivationCredential,
configuration: PrimordialActivationConfiguration = .default,
feature: PrimordialActivationFeature = .runtime
) async throws -> PrimordialActivationStatus
var isActivated: Bool { get }
func activationStatus() -> PrimordialActivationStatus
Types
PrimordialActivationConfiguration
.default.defaultActivationEndpointactivationEndpoint: URLrequestTimeout: TimeIntervalinit(activationEndpoint:requestTimeout:)
PrimordialActivationCredential
.evaluationKey(String)
PrimordialActivationFeature
.runtime.textGeneration.embeddings.voice
PrimordialActivationStatus
.inactive.evaluation(PrimordialEvaluationActivation)isActivated: Bool
PrimordialEvaluationActivation
evaluationKeyIdprojectIdappIdinit(evaluationKeyId:projectId:appId:)
PrimordialActivationError
See Errors for all cases.
Background download events
Declaration
static func handleEventsForBackgroundURLSession(
identifier: String,
completionHandler: @escaping () -> Void
) -> Bool
The method returns true when the identifier belongs to Primordial. Forward iOS background
URL-session events as shown in Troubleshooting.
AI configuration
Declarations
// PrimordialAIConfiguration
init(
generation: PrimordialGenerationSelection = .model(.init()),
embedding: PrimordialEmbeddingModel = .paraphraseMultilingualMiniLML12V2,
speech: PrimordialSpeechModel = .parakeetMultilingual
)
// PrimordialModelConfiguration
init(
model: PrimordialModelDescriptor = .qwen3_1_7B4Bit,
defaultSystemPrompt: String = "You are a helpful assistant.",
extraEOSTokens: [String] = ["<|end|>"],
gpuCacheLimitBytes: Int = 20 * 1024 * 1024,
maxTokens: Int = 1024,
temperature: Float = 0.6
)
// PrimordialAppleFoundationModelConfiguration
init(
defaultSystemPrompt: String = "You are a helpful assistant.",
maxTokens: Int? = nil,
temperature: Double? = 0.6,
fallback: PrimordialGenerationFallback? = nil
)
Types
PrimordialAIConfiguration
generation: PrimordialGenerationSelectionembedding: PrimordialEmbeddingModelspeech: PrimordialSpeechModel.default.defaultVersioninit(generation:embedding:speech:)
PrimordialGenerationSelection
.model(PrimordialModelConfiguration).appleFoundationModel(PrimordialAppleFoundationModelConfiguration = .init())
PrimordialModelConfiguration
model: PrimordialModelDescriptordefaultSystemPrompt: StringextraEOSTokens: [String]gpuCacheLimitBytes: IntmaxTokens: Inttemperature: Floatinit(model:defaultSystemPrompt:extraEOSTokens:gpuCacheLimitBytes:maxTokens:temperature:)
PrimordialAppleFoundationModelConfiguration
defaultSystemPrompt: StringmaxTokens: Int?temperature: Double?fallback: PrimordialGenerationFallback?init(defaultSystemPrompt:maxTokens:temperature:fallback:)
PrimordialGenerationFallback
.requireDecision(PrimordialModelConfiguration)
PrimordialSpeechModel
.parakeetMultilingual
AI Models
PrimordialModelIdentifier
rawValue: Stringinit(rawValue:)
PrimordialModelDescriptor
identifier,displayNamecapabilities: PrimordialModelCapabilities; read-only to applicationslicense: String?.qwen3_1_7B4Bitinit(identifier:displayName:contextWindow:minimumMemoryBytes:license:)
PrimordialModelCapabilities
features: PrimordialTechnicalFeaturecontextWindow: Int?minimumMemoryBytes: Int64?init(features:contextWindow:minimumMemoryBytes:)
PrimordialTechnicalFeature
rawValue: Int.localExecution,.textGeneration.streaming,.structuredOutput.toolCalling,.speechRecognition.audioRecordinginit(rawValue:)
PrimordialEmbeddingModel
id: Stringschema: VectorEmbeddingSchema.paraphraseMultilingualMiniLML12V2custom(modelID:schema:)
PrimordialModel
identifier: StringdisplayName: String?kind: PrimordialModelKindinit(identifier:displayName:kind:)
PrimordialModelKind
.generation.embedding.speech
Status, capabilities, and installation
Declarations
// PrimordialAI
func status() async -> PrimordialAIStatus
func capabilities() async -> PrimordialAICapabilities
var generation: PrimordialAIResource { get }
var embedding: PrimordialAIResource { get }
var speech: PrimordialAIResource { get }
func status(
for capability: PrimordialAICapability
) async -> PrimordialCapabilityStatus
func status(
for capabilities: [PrimordialAICapability]
) async -> PrimordialCapabilityStatus
func makeAvailable(
_ capability: PrimordialAICapability
) -> AsyncThrowingStream<PrimordialCapabilityProgress, any Error>
func makeAvailable(
_ capabilities: [PrimordialAICapability]
) -> AsyncThrowingStream<PrimordialCapabilityProgress, any Error>
func activateFallback(
for capability: PrimordialAICapability = .generation
) -> AsyncThrowingStream<PrimordialCapabilityProgress, any Error>
func activateFallback(
for capabilities: [PrimordialAICapability]
) -> AsyncThrowingStream<PrimordialCapabilityProgress, any Error>
// PrimordialAIResource
func capabilities() async -> PrimordialResourceCapabilities
Types
PrimordialAI
status()status(for: PrimordialAICapability)status(for: [PrimordialAICapability])capabilities()makeAvailable(_: PrimordialAICapability)makeAvailable(_: [PrimordialAICapability])activateFallback(for: PrimordialAICapability = .generation)activateFallback(for: [PrimordialAICapability])generation,embedding,speech
PrimordialAIResource
capabilities() async -> PrimordialResourceCapabilities
PrimordialAICapability
.semanticSearch.voiceInput.answering.generation
PrimordialAIStatus
generation,embedding,speechdownloadBytesrequiredAvailableBytes
PrimordialCapabilityStatus
capabilitiesgeneration,embedding,speechdownloadBytes,requiredAvailableBytesisInstalled,isAvailable
PrimordialAICapabilities
generation: PrimordialResourceCapabilitiesembedding: PrimordialResourceCapabilitiesspeech: PrimordialResourceCapabilities
PrimordialResourceCapabilities
model,features,availabilitylanguageIdentifiers,dimensionsmaximumInputTokens,minimumMemoryBytesisAvailable
activateFallback(for:) is the explicit, application-authorized path for a configured Apple
generation fallback. It is available only while Apple generation is unavailable, installs every resource
required by the requested capabilities, and selects the fallback on the same client after installation
succeeds. Ordinary makeAvailable never selects it.
State and progress payloads
States and progress values are returned by the status and installation declarations above.
PrimordialModelState
.systemAvailable,.systemUnavailable.downloadRequired,.downloading,.downloaded.loading,.ready,.failed
PrimordialSystemModelUnavailableReason
.deviceNotEligible.appleIntelligenceNotEnabled.modelNotReady.unsupportedLocale(identifier:).unknown(String? = nil)
PrimordialResourceAvailability
.available.unavailable(String).systemUnavailable(PrimordialSystemModelUnavailableReason)
PrimordialModelPhase
.checking,.downloading.verifying,.loading,.ready
PrimordialCapabilityProgress
fractionCompleted,downloadedBytes,totalBytescurrentModel,currentCapabilityphase,resources
PrimordialResourceProgress
model,capabilities,phasefractionCompleted,downloadedBytes,totalBytes
PrimordialCapabilityRequirement
capability,modelsdownloadBytes,requiredAvailableBytesreason: PrimordialCapabilityUnavailableReason
PrimordialCapabilityUnavailableReason
.notInstalled,.systemUnavailable.incompatibleDevice,.insufficientStorage.verificationFailed,.resourceConflict.corruptedStorage
PrimordialStorageRequirement
contentBytes,safetyMarginBytesrequiredAvailableBytes,availableBytesinit(contentBytes:safetyMarginBytes:requiredAvailableBytes:availableBytes:)
PrimordialDownloadOptions
checksAvailableStoragestorageSafetyMarginFractionminimumStorageSafetyMarginBytes.default,.withoutStorageCheck-
init(checksAvailableStorage:storageSafetyMarginFraction:minimumStorageSafetyMarginBytes:)
Generation tasks
Declarations
func summarize(
_ text: String,
style: PrimordialSummaryStyle = .concise
) async throws -> String
func streamSummarize(
_ text: String,
style: PrimordialSummaryStyle = .concise
) -> AsyncThrowingStream<PrimordialTextChunk, any Error>
func classify(_ text: String, into categories: [String]) async throws -> String
func task(
prompt: String,
input: String,
using collections: [PrimordialCollection] = [],
where filter: PrimordialFilter? = nil,
options: PrimordialAnswerOptions = .init()
) async throws -> PrimordialTaskResult<String>
func streamTask(
prompt: String,
input: String,
using collections: [PrimordialCollection] = [],
where filter: PrimordialFilter? = nil,
options: PrimordialAnswerOptions = .init()
) -> AsyncThrowingStream<PrimordialTaskEvent, any Error>
func extract<Output: Decodable & Sendable>(
_ text: String,
as output: PrimordialOutputSchema<Output>
) async throws -> Output
func task<Output: Decodable & Sendable>(
prompt: String,
input: String,
using collections: [PrimordialCollection] = [],
where filter: PrimordialFilter? = nil,
options: PrimordialAnswerOptions = .init(),
as output: PrimordialOutputSchema<Output>
) async throws -> PrimordialTaskResult<Output>
Supporting types
PrimordialSummaryStyle
.concise.bulletPoints(maximum: Int)
PrimordialTextChunk
text: StringisFinal: Bool
PrimordialTaskResult<Output>
output: Outputcitations: [PrimordialCitation]
PrimordialTaskEvent
.fragment(String).citation(PrimordialCitation).completed(PrimordialTaskResult<String>)
PrimordialOutputSchema<Output>
schema: PrimordialValueSchemainit(_:schema:)
PrimordialValueSchema
.string,.oneOf,.integer,.number,.boolean.array(PrimordialValueSchema).object(_:optional:)
Managed collections
Declarations
func collection(_ name: String) throws -> PrimordialCollection
nonisolated func replaceAll(with records: [PrimordialRecord])
-> AsyncThrowingStream<PrimordialSynchronizationEvent, any Error>
nonisolated func apply(_ changes: [PrimordialRecordChange])
-> AsyncThrowingStream<PrimordialSynchronizationEvent, any Error>
nonisolated func synchronize(
from source: any PrimordialRecordSource,
options: PrimordialSynchronizationOptions = .init()
) -> AsyncThrowingStream<PrimordialSynchronizationEvent, any Error>
func synchronizationStatus() async throws -> PrimordialSynchronizationStatus
func reset() async throws
func statistics() async throws -> PrimordialCollectionStatistics
func search(
_ query: String,
fields: [String]? = nil,
weights: [String: Double] = [:],
filter: PrimordialFilter? = nil,
limit: Int = 8
) async throws -> [PrimordialMatch]
func related(
to id: String,
fields: [String]? = nil,
weights: [String: Double] = [:],
filter: PrimordialFilter? = nil,
limit: Int = 8
) async throws -> [PrimordialMatch]
nonisolated func reindex() -> AsyncThrowingStream<PrimordialIndexProgress, any Error>
Collection names are normalized and scoped to the client identifier. replaceAll,
apply, and synchronize emit synchronization events; reindex emits
index progress.
Record source contract
protocol PrimordialRecordSource: Sendable {
var identifier: String { get }
var schemaVersion: String { get }
var supportsIncrementalChanges: Bool { get }
func snapshot(
after cursor: PrimordialSourceCursor?,
limit: Int
) async throws -> PrimordialSourceSnapshotPage
func changes(
after checkpoint: PrimordialSourceCheckpoint,
limit: Int
) async throws -> PrimordialSourceChangePage
}
SwiftData source
struct PrimordialSwiftDataSource<Model>: PrimordialRecordSource
where Model: PersistentModel {
init<ID>(
identifier: String,
schemaVersion: String,
container: ModelContainer,
descriptor: FetchDescriptor<Model> = .init(),
recordID: any KeyPath<Model, ID> & Sendable,
encodeID: @escaping @Sendable (ID) throws -> String,
fields: @escaping @Sendable (Model) throws
-> [String: PrimordialFieldValue]
) throws
where ID: Codable & Comparable & Hashable & Sendable
}
Supporting types
PrimordialCollection
name: StringclientIdentifier: String
PrimordialRecord
id: Stringfields: [String: PrimordialFieldValue]init(id:fields:)
PrimordialRecordChange
.upsert(PrimordialRecord).remove(id: String)
PrimordialFieldValue
.text,.keyword,.stringList.integer,.double,.bool,.date
PrimordialSourceCursor
data: Datainit(data:)
PrimordialSourceCheckpoint
data: Datainit(data:)
PrimordialSourceSnapshotPage
records: [PrimordialRecord]nextCursor: PrimordialSourceCursor?checkpoint: PrimordialSourceCheckpoint?
PrimordialSourceChangePage
changes: [PrimordialRecordChange]nextCheckpoint: PrimordialSourceCheckpointhasMore: Bool
PrimordialRecordSourceError
.checkpointExpired,.invalidCheckpoint.invalidSource,.malformedPage,.unavailable
PrimordialSynchronizationOptions
mode: PrimordialSynchronizationModebatchSize: Int, default100init(mode:batchSize:)
PrimordialSynchronizationMode
.automatic,.incremental,.snapshot
PrimordialSynchronizationEvent
.progress(PrimordialSynchronizationProgress).completed(PrimordialSynchronizationReport)
PrimordialSynchronizationProgress
phase: PrimordialSynchronizationPhasechangedRecords: Int- Phases:
.readingSource,.validating,.embedding,.committing,.ready
PrimordialSynchronizationReport
changedRecords,removedRecordsreusedEmbeddings,generatedEmbeddings
PrimordialSynchronizationStatus
sourceIdentifier,sourceSchemaVersionhasCheckpoint,requiresSnapshotlastCompletedAt,lastReport
PrimordialFilter
.all,.any,.not.field(String, PrimordialFilterComparison)
PrimordialFilterComparison
.equals,.notEquals,.oneOf.lessThan,.lessThanOrEqual.greaterThan,.greaterThanOrEqual.contains(String)
PrimordialMatch
collection,recordID,fieldexcerpt,fields,score,sourceRange
PrimordialCollectionStatistics
recordCount,fieldCount,chunkCountembeddingModelID,embeddingDimensions,chunkingVersion
PrimordialIndexProgress
phase: PrimordialIndexPhasecompletedRecords,totalRecords,fractionCompleted- Phases:
.validating,.embedding,.committing,.ready.
PrimordialCollectionError
See Errors for all cases.
Grounded answers
Declarations
func answer(
_ question: String,
using collections: [PrimordialCollection],
options: PrimordialAnswerOptions = .init()
) async throws -> PrimordialAnswer
func streamAnswer(
_ question: String,
using collections: [PrimordialCollection],
options: PrimordialAnswerOptions = .init()
) -> AsyncThrowingStream<PrimordialAnswerEvent, any Error>
Supporting types
PrimordialAnswerOptions
fields,weights,filterresultLimit,contextCharacterLimitinit(fields:weights:filter:resultLimit:contextCharacterLimit:)
PrimordialAnswer
text: Stringcitations: [PrimordialCitation]
PrimordialCitation
collection,recordID,fieldexcerpt,fields,sourceRange
PrimordialAnswerEvent
.fragment(String).completed(PrimordialAnswer)
Chat
Declarations
// PrimordialClient
func chat(
messages: [PrimordialChatMessage] = []
) throws -> PrimordialChat
func chat(
using collections: [PrimordialCollection],
options: PrimordialAnswerOptions = .init(),
messages: [PrimordialChatMessage] = []
) throws -> PrimordialChat
// PrimordialChat
var messages: [PrimordialChatMessage] { get }
func send(_ text: String) async throws -> PrimordialChatMessage
nonisolated func stream(
_ text: String
) -> AsyncThrowingStream<PrimordialChatEvent, any Error>
func clear() throws
func reset() throws
Supporting types
PrimordialChat
messages: [PrimordialChatMessage]send(_:),stream(_:)clear(),reset()
PrimordialChatMessage
role: PrimordialChatRoletext: Stringcitations: [PrimordialCitation]init(role:text:citations:)
PrimordialChatRole
.user.assistant
PrimordialChatEvent
.fragment(String).completed(PrimordialChatMessage)
Speech
Declarations
func transcribe(_ audioURL: URL) async throws -> PrimordialTranscription
func recording(localeIdentifier: String = "en-US") -> PrimordialRecordingSession
func start(
onUpdate: (@MainActor @Sendable (PrimordialRecordingUpdate) -> Void)? = nil
) async throws
func stop() async throws -> PrimordialRecordingResult
func cancel() async
Supporting types
PrimordialTranscription
text: Stringsegments: [PrimordialTranscriptSegment]languageIdentifier: String?duration: TimeInterval
PrimordialTranscriptSegment
text: StringstartTime: TimeIntervalendTime: TimeInterval
PrimordialRecordingUpdate
liveText,confirmedTextisFinal,isDualTrack
PrimordialRecordingResult
transcription: PrimordialTranscriptionaudioData: Data?
PrimordialRecordingSession
start(onUpdate:)stop() async throws -> PrimordialRecordingResultcancel()
Advanced API
primordial.advanced APIs provide deliberate low-level control.
Declarations
func embed(_ input: String) async throws -> PrimordialEmbedding
func embed(_ inputs: [String]) async throws -> [PrimordialEmbedding]
func session(
prompt: String = "",
messages: [PrimordialChatMessage] = []
) throws -> PrimordialAdvancedGenerationSession
func vectorStore(_ name: String) throws -> PrimordialRawVectorStore
// PrimordialAdvancedGenerationSession
func generate(_ input: String) async throws -> String
nonisolated func stream(_ input: String) -> AsyncThrowingStream<PrimordialTextChunk, any Error>
func clear() throws
func reset() throws
// PrimordialAdvancedResource
func load() async throws
func unload() async throws
func removeDownload() async throws
// PrimordialAdvanced
func recording(
localeIdentifier: String = "en-US"
) -> PrimordialAdvancedRecordingSession
// PrimordialAdvancedRecordingSession
nonisolated let updates: AsyncStream<PrimordialRecordingUpdate>
func requestAuthorization() async throws
func start() async throws
func stop() async throws -> PrimordialRecordingResult
func cancel() async
Supporting types
PrimordialAdvanced
embed(_: String),embed(_: [String])session(prompt:messages:)vectorStore(_:)recording(localeIdentifier:)generation,embedding,speech
PrimordialAdvancedResource
load()unload()removeDownload()
PrimordialAdvancedGenerationSession
messages: [PrimordialChatMessage]generate(_:),stream(_:)clear(),reset()
PrimordialAdvancedRecordingSession
updates: AsyncStream<PrimordialRecordingUpdate>requestAuthorization()start(),stop(),cancel()
Advanced vector store
Declarations
actor PrimordialRawVectorStore {
func upsert(_ records: [VectorRecord]) async throws
func search(
_ query: String,
limit: Int = 8,
threshold: Double? = nil,
filter: VectorFilter? = nil,
spaces: [String]? = nil
) async throws -> [VectorSearchResult]
func search(
_ embedding: PrimordialEmbedding,
limit: Int = 8,
threshold: Double? = nil,
filter: VectorFilter? = nil,
spaces: [String]? = nil
) async throws -> [VectorSearchResult]
func delete(ids: [String]) async throws
func delete(where filter: VectorFilter) async throws
func reindex(where filter: VectorFilter? = nil) async throws
func status() async throws -> VectorStoreStatus
func removeAll() async throws
}
Supporting types
PrimordialRawVectorStore
A Primordial-owned actor for isolated semantic vector records, search, deletion, reindexing, status, and removal.
PrimordialEmbedding
values: [Float]model: PrimordialEmbeddingModelinit(values:model:)
VectorRecord
id,metadata,representationsinit(id:text:metadata:embeddingText:)init(id:metadata:representations:)
VectorRepresentation
.defaultSpacespace,text,embeddingText,embeddingembeddingInputinit(space:text:embeddingText:embedding:)
VectorEmbeddingSchema
dimensions.d384Cosine,.d768Cosine.d1024Cosine,.d1536Cosine
VectorMetadataValue
.string,.stringArray,.int.double,.bool,.date
VectorFilter
.all,.any,.not.condition(key:comparison:).where(_:_:)
VectorFilterComparison
.equals,.notEquals,.in.lessThan,.lessThanOrEqual.greaterThan,.greaterThanOrEqual.contains(String)
VectorSearchResult
id,score,textmatchedSpace,metadata
VectorStoreStatus
recordCount,embeddingCount,spacesembeddingModelID,embeddingDimensions,lastUpdatedAt
VectorStoreError
See Errors for all cases.
Errors and cancellation
SDK failures use stable typed errors. Cancelling a Swift task remains CancellationError and is
not converted into an SDK error.
Error types
PrimordialAIError
.capabilityUnavailable,.unsupportedFeature.invalidConfiguration,.invalidQuery,.invalidRecord.contextWindowExceeded,.generationFailed,.embeddingFailed.transcriptionFailed,.recordingFailed,.structuredOutputInvalid.permissionDenied,.resourceConflict,.resourceOperationFailed.insufficientStorage,.downloadFailed,.verificationFailed,.corruptedStorage
PrimordialActivationError
.activationRequired,.evaluationKeyRequired.evaluationKeyInvalid,.evaluationKeyRevoked,.evaluationKeyExpired.activationMetadataMissing,.unregisteredAppIdentifier.invalidActivationResponse,.activationRequestFailed,.activationServerError
PrimordialCollectionError
.invalidName,.invalidClientIdentifier.invalidRecord,.invalidField,.invalidQuery.invalidSynchronizationOptions,.sourceManaged,.checkpointRequired.sourceMismatch,.sourceSchemaMismatch.recordNotFound,.incompatibleIndex,.operationFailed
PrimordialRecordSourceError
.checkpointExpired,.invalidCheckpoint.invalidSource,.malformedPage,.unavailable
VectorStoreError
.unavailable,.embeddingProviderRequired,.embeddingGenerationFailed.invalidRecord,.invalidMetadata,.invalidEmbeddingModel.invalidVectorDimensions.unsupportedEmbeddingSchema,.unsupportedEmbeddingModel.embeddingModelNotDownloaded,.embeddingModelNotLoaded.storeInitializationFailed,.storageOperationFailed