Skip to content

Commit 13a9abe

Browse files
committed
add option to run single tasks and connect OpenAI key from settings
1 parent dea0478 commit 13a9abe

2 files changed

Lines changed: 43 additions & 16 deletions

File tree

Core/Sources/HostApp/Benchmark/Domain/Manager/BenchmarkManager.swift

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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")!

Core/Sources/HostApp/Benchmark/Presentation/ViewModel/BenchmarkViewModel.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,8 @@ class BenchmarkViewModel: ObservableObject {
4646
toast.toast(content: "Failed deleting directory.", level: .error)
4747
}
4848
}
49+
50+
func runTask(index: Int, in directory: BenchmarkDirectory) async {
51+
await benchmarkManager.runTask(at: index, in: directory)
52+
}
4953
}

0 commit comments

Comments
 (0)