diff --git a/体己/AI/AIRuntime.swift b/体己/AI/AIRuntime.swift index cdc518a..e061c0f 100644 --- a/体己/AI/AIRuntime.swift +++ b/体己/AI/AIRuntime.swift @@ -80,7 +80,9 @@ actor AIRuntime { // session.generate 跨 actor 边界,需要 await let stream = await session.generate(prompt: prompt, maxTokens: maxTokens) for try await chunk in stream { - await self.recordRate(chunk.decodeRate) + // Task 闭包在 generate() 内启动,继承 AIRuntime 的 actor 隔离; + // 调用同 actor 的 recordRate 不需要 await + self.recordRate(chunk.decodeRate) continuation.yield(chunk) } continuation.finish() diff --git a/体己/AI/ModelStore.swift b/体己/AI/ModelStore.swift index 06ce918..834db85 100644 --- a/体己/AI/ModelStore.swift +++ b/体己/AI/ModelStore.swift @@ -21,8 +21,10 @@ enum ModelKind: String, CaseIterable { /// `@unchecked Sendable`:rootURL 是 let,方法只读 filesystem(线程安全), /// 可被任意 actor / Task 跨边界访问。 +/// `nonisolated(unsafe) shared`:项目开启 `-default-isolation=MainActor` 后 +/// static 默认 MainActor 隔离,跨 actor 访问需要 await。这里手动 opt-out。 final class ModelStore: @unchecked Sendable { - static let shared: ModelStore = { + nonisolated(unsafe) static let shared: ModelStore = { do { let appSupport = try FileManager.default.url( for: .applicationSupportDirectory, diff --git a/体己/Persistence/FileVault.swift b/体己/Persistence/FileVault.swift index 0d42634..77c4dc8 100644 --- a/体己/Persistence/FileVault.swift +++ b/体己/Persistence/FileVault.swift @@ -10,8 +10,9 @@ enum FileVaultError: Error { /// `@unchecked Sendable`:rootURL 是 let,方法只 I/O 到沙盒目录(线程安全), /// 可被任意 actor / Task 跨边界访问。 +/// `nonisolated(unsafe) shared`:见 ModelStore 同款注释。 final class FileVault: @unchecked Sendable { - static let shared: FileVault = { + nonisolated(unsafe) static let shared: FileVault = { do { let appSupport = try FileManager.default.url( for: .applicationSupportDirectory,