2023-04-22 14:52:27 -07:00
|
|
|
import Foundation
|
|
|
|
import GRPC
|
2023-04-22 15:43:22 -07:00
|
|
|
import StableDiffusionCore
|
2023-04-22 14:52:27 -07:00
|
|
|
import StableDiffusionProtos
|
|
|
|
|
|
|
|
class ImageGenerationServiceProvider: SdImageGenerationServiceAsyncProvider {
|
2023-05-08 16:06:07 -07:00
|
|
|
private let jobManager: JobManager
|
2023-04-22 14:52:27 -07:00
|
|
|
private let modelManager: ModelManager
|
2023-04-22 15:43:22 -07:00
|
|
|
|
2023-05-08 16:06:07 -07:00
|
|
|
init(jobManager: JobManager, modelManager: ModelManager) {
|
|
|
|
self.jobManager = jobManager
|
2023-04-22 14:52:27 -07:00
|
|
|
self.modelManager = modelManager
|
|
|
|
}
|
2023-04-22 15:43:22 -07:00
|
|
|
|
2023-04-23 02:09:50 -07:00
|
|
|
func generateImages(request: SdGenerateImagesRequest, context _: GRPCAsyncServerCallContext) async throws -> SdGenerateImagesResponse {
|
2023-04-23 14:22:10 -07:00
|
|
|
guard let state = await modelManager.getModelState(name: request.modelName) else {
|
|
|
|
throw SdCoreError.modelNotFound
|
2023-04-22 14:52:27 -07:00
|
|
|
}
|
2023-05-08 16:06:07 -07:00
|
|
|
let job = await jobManager.create()
|
|
|
|
DispatchQueue.main.async {
|
|
|
|
Task {
|
|
|
|
await self.jobManager.updateJobQueued(job)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return try await state.generate(request, job: job)
|
2023-04-23 14:22:10 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func generateImagesStreaming(request: SdGenerateImagesRequest, responseStream: GRPCAsyncResponseStreamWriter<SdGenerateImagesStreamUpdate>, context _: GRPCAsyncServerCallContext) async throws {
|
|
|
|
guard let state = await modelManager.getModelState(name: request.modelName) else {
|
|
|
|
throw SdCoreError.modelNotFound
|
|
|
|
}
|
2023-05-08 16:06:07 -07:00
|
|
|
let job = await jobManager.create()
|
|
|
|
DispatchQueue.main.async {
|
|
|
|
Task {
|
|
|
|
await self.jobManager.updateJobQueued(job)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_ = try await state.generate(request, job: job, stream: responseStream)
|
2023-04-22 14:52:27 -07:00
|
|
|
}
|
|
|
|
}
|