@@ -34,6 +34,8 @@ class RealtimeSuggestionControllerBenchmarkManager: BenchmarkManager {
3434 var taskStates : AnyPublisher < [ TaskStatus ] , Never > {
3535 taskStatesSubject. eraseToAnyPublisher ( )
3636 }
37+ private var openAIKey : String ?
38+ private var cancellables = Set < AnyCancellable > ( )
3739
3840 init ( benchmarkSettingsRepository: BenchmarkSettingsRepository ) {
3941 @Dependency ( \. workspacePool) var workspacePool
@@ -51,24 +53,29 @@ class RealtimeSuggestionControllerBenchmarkManager: BenchmarkManager {
5153 }
5254 self . workspacePool = workspacePool
5355 self . benchmarkSettingsRepository = benchmarkSettingsRepository
56+
57+ benchmarkSettingsRepository. benchmarkDirectories. sink { [ weak self] benchmarkDirectories in
58+ for directory in benchmarkDirectories {
59+ guard let taskPaths: [ URL ] = self ? . getTaskFolders ( in: directory. url) else {
60+ return
61+ }
62+ let initialTaskStates = taskPaths. map { _ in TaskStatus . notStarted }
63+ Task { await self ? . updateTaskStates ( initialTaskStates) }
64+ }
65+ } . store ( in: & cancellables)
66+
67+ benchmarkSettingsRepository. openAIKey. sink { [ weak self] key in
68+ self ? . openAIKey = key
69+ } . store ( in: & cancellables)
5470 }
5571
5672 func getCodeSuggestions( at benchmarkDirectory: BenchmarkDirectory ) async throws {
5773 let taskPaths : [ URL ] = getTaskFolders ( in: benchmarkDirectory. url)
58- let initialTaskStates = taskPaths. map { _ in TaskStatus . notStarted }
74+ let initialTaskStates = taskPaths. map { _ in TaskStatus . scheduled }
5975 await updateTaskStates ( initialTaskStates)
60- for (index, taskPath) in taskPaths. prefix ( 1 ) . enumerated ( ) {
61- await updateTaskStatus ( . running, at: index)
62- if let suggestion = await getCodeSuggestionFromService ( at: taskPath, from: benchmarkDirectory. url) {
63- // if let suggestion = await getCodeSuggestionFromOpenAI(at: taskPath, from: benchmarkDirectory.url) {
64- await applyCodeSuggestion ( suggestion: suggestion. suggestion, at: suggestion. fileURL)
65- await storeContentInOutputDirectory ( suggestion, for: index+ 1 , in: benchmarkDirectory)
66- await updateTaskStatus ( . success, at: index)
67- try await Task . sleep ( nanoseconds: 3_000_000_000 )
68- } else {
69- await updateTaskStatus ( . failure, at: index)
70- }
71- await cleanUp ( )
76+ for (index, _) in taskPaths. prefix ( 1 ) . enumerated ( ) {
77+ await runTask ( at: index, in: benchmarkDirectory)
78+ try await Task . sleep ( nanoseconds: 3_000_000_000 )
7279 }
7380 }
7481
@@ -156,7 +163,22 @@ class RealtimeSuggestionControllerBenchmarkManager: BenchmarkManager {
156163 await workspace. didUpdateFilespace ( fileURL: entrypoint. fileURL, content: content, version: 1 )
157164 }
158165
159- func getCodeSuggestionFromOpenAI( at directory: URL , from benchmarkDirectory: URL ) async -> SuggestionResponse ? {
166+ func runTask( at index: Int , in benchmarkDirectory: BenchmarkDirectory ) async {
167+ let taskPath = getTaskFolders ( in: benchmarkDirectory. url) [ index]
168+ await updateTaskStatus ( . running, at: index)
169+ // if let suggestion = await getCodeSuggestionFromService(at: taskPath, from: benchmarkDirectory.url) {
170+ if let openAIKey = openAIKey,
171+ let suggestion = await getCodeSuggestionFromOpenAI ( at: taskPath, from: benchmarkDirectory. url, key: openAIKey) {
172+ await applyCodeSuggestion ( suggestion: suggestion. suggestion, at: suggestion. fileURL)
173+ await storeContentInOutputDirectory ( suggestion, for: index+ 1 , in: benchmarkDirectory)
174+ await updateTaskStatus ( . success, at: index)
175+ } else {
176+ await updateTaskStatus ( . failure, at: index)
177+ }
178+ await cleanUp ( )
179+ }
180+
181+ func getCodeSuggestionFromOpenAI( at directory: URL , from benchmarkDirectory: URL , key: String ) async -> SuggestionResponse ? {
160182 guard let metadata: MetadataDTO = readMetadata ( at: directory) ,
161183 let xcodeWorkspaceFileURL = findXcodeWorkspace ( in: benchmarkDirectory) ,
162184 let workspace = try ? await workspacePool. fetchOrCreateWorkspace ( workspaceURL: xcodeWorkspaceFileURL)
@@ -191,7 +213,7 @@ class RealtimeSuggestionControllerBenchmarkManager: BenchmarkManager {
191213 relevantCodeSnippets: relevantSymbols. mapToRelevantCodeSnippets ( )
192214 )
193215 let workspaceInfo = WorkspaceInfo ( workspaceURL: xcodeWorkspaceFileURL, projectURL: benchmarkDirectory)
194- let repository = OpenAICompletionRepository ( config: . init( ) )
216+ let repository = OpenAICompletionRepository ( config: . init( apiKey : key ) )
195217 do {
196218 // only works when setting document version GitHubCopilotService to 0
197219 let suggestion = try await repository. structuredEdit ( for: suggestionRequest)
@@ -597,6 +619,7 @@ enum TaskStatus {
597619 case failure
598620 case notStarted
599621 case running
622+ case scheduled
600623}
601624
602625
@@ -668,7 +691,7 @@ public struct OpenAICompletionRepository: CodeCompletionRepository, Sendable {
668691 public var baseURL : URL
669692
670693 public init (
671- apiKey: String = " " ,
694+ apiKey: String ,
672695 model: String = " gpt-4o-mini " ,
673696 organization: String ? = nil ,
674697 baseURL: URL = URL ( string: " https://api.openai.com/v1 " ) !
0 commit comments