diff --git a/Demo/App/APIProvidedView.swift b/Demo/App/APIProvidedView.swift index d7cd794d..25e7ad87 100644 --- a/Demo/App/APIProvidedView.swift +++ b/Demo/App/APIProvidedView.swift @@ -12,6 +12,7 @@ import SwiftUI struct APIProvidedView: View { @Binding var apiKey: String @StateObject var chatStore: ChatStore + @StateObject var miscStore: MiscStore @State var isShowingAPIConfigModal: Bool = true @Environment(\.idProviderValue) var idProvider @@ -28,11 +29,17 @@ struct APIProvidedView: View { idProvider: idProvider ) ) + self._miscStore = StateObject( + wrappedValue: MiscStore( + openAIClient: OpenAI(apiToken: apiKey.wrappedValue) + ) + ) } var body: some View { ContentView( - chatStore: chatStore + chatStore: chatStore, + miscStore: miscStore ) .onChange(of: apiKey) { newApiKey in chatStore.openAIClient = OpenAI(apiToken: newApiKey) diff --git a/Demo/App/ContentView.swift b/Demo/App/ContentView.swift index 204266af..1e2283cf 100644 --- a/Demo/App/ContentView.swift +++ b/Demo/App/ContentView.swift @@ -11,6 +11,7 @@ import SwiftUI struct ContentView: View { @ObservedObject var chatStore: ChatStore + @ObservedObject var miscStore: MiscStore @State private var selectedTab = 0 @Environment(\.idProviderValue) var idProvider @@ -37,6 +38,14 @@ struct ContentView: View { Label("Image", systemImage: "photo") } .tag(2) + + MiscView( + store: miscStore + ) + .tabItem { + Label("Misc", systemImage: "ellipsis") + } + .tag(3) } } } diff --git a/Demo/DemoChat/Sources/ChatStore.swift b/Demo/DemoChat/Sources/ChatStore.swift index 59c74a77..a785d1d0 100644 --- a/Demo/DemoChat/Sources/ChatStore.swift +++ b/Demo/DemoChat/Sources/ChatStore.swift @@ -1,5 +1,5 @@ // -// Store.swift +// ChatStore.swift // DemoChat // // Created by Sihao Lu on 3/25/23. diff --git a/Demo/DemoChat/Sources/MiscStore.swift b/Demo/DemoChat/Sources/MiscStore.swift new file mode 100644 index 00000000..4879d8e9 --- /dev/null +++ b/Demo/DemoChat/Sources/MiscStore.swift @@ -0,0 +1,32 @@ +// +// MiscStore.swift +// DemoChat +// +// Created by Aled Samuel on 22/04/2023. +// + +import Foundation +import OpenAI + +public final class MiscStore: ObservableObject { + public var openAIClient: OpenAIProtocol + + @Published var availableModels: [ModelResult] = [] + + public init( + openAIClient: OpenAIProtocol + ) { + self.openAIClient = openAIClient + } + + @MainActor + func getModels() async { + do { + let response = try await openAIClient.models() + availableModels = response.data + } catch { + // TODO: Better error handling + print(error.localizedDescription) + } + } +} diff --git a/Demo/DemoChat/Sources/UI/ConversationView.swift b/Demo/DemoChat/Sources/UI/ChatView.swift similarity index 100% rename from Demo/DemoChat/Sources/UI/ConversationView.swift rename to Demo/DemoChat/Sources/UI/ChatView.swift diff --git a/Demo/DemoChat/Sources/UI/Environment/IDProvider.swift b/Demo/DemoChat/Sources/UI/Environment/IDProvider.swift index 01c08906..007a1d4c 100644 --- a/Demo/DemoChat/Sources/UI/Environment/IDProvider.swift +++ b/Demo/DemoChat/Sources/UI/Environment/IDProvider.swift @@ -1,6 +1,6 @@ // // IDProvider.swift -// +// DemoChat // // Created by Sihao Lu on 4/6/23. // diff --git a/Demo/DemoChat/Sources/UI/Misc/ListModelsView.swift b/Demo/DemoChat/Sources/UI/Misc/ListModelsView.swift new file mode 100644 index 00000000..b7396698 --- /dev/null +++ b/Demo/DemoChat/Sources/UI/Misc/ListModelsView.swift @@ -0,0 +1,27 @@ +// +// ListModelsView.swift +// DemoChat +// +// Created by Aled Samuel on 22/04/2023. +// + +import SwiftUI + +public struct ListModelsView: View { + @ObservedObject var store: MiscStore + + public var body: some View { + NavigationStack { + List($store.availableModels) { row in + Text(row.id) + } + .listStyle(.insetGrouped) + .navigationTitle("Models") + } + .onAppear { + Task { + await store.getModels() + } + } + } +} diff --git a/Demo/DemoChat/Sources/UI/Misc/MiscView.swift b/Demo/DemoChat/Sources/UI/Misc/MiscView.swift new file mode 100644 index 00000000..88d1936e --- /dev/null +++ b/Demo/DemoChat/Sources/UI/Misc/MiscView.swift @@ -0,0 +1,36 @@ +// +// MiscView.swift +// DemoChat +// +// Created by Aled Samuel on 22/04/2023. +// + +import SwiftUI + +public struct MiscView: View { + @ObservedObject var store: MiscStore + + public init(store: MiscStore) { + self.store = store + } + + public var body: some View { + NavigationStack { + List { + Section(header: Text("Models")) { + NavigationLink("List Models", destination: ListModelsView(store: store)) + NavigationLink("Retrieve Model", destination: RetrieveModelView()) + } + } + .listStyle(.insetGrouped) + .navigationTitle("Misc") + } + } +} + +struct RetrieveModelView: View { + var body: some View { + Text("Retrieve Model: TBD") + .font(.largeTitle) + } +} diff --git a/Sources/OpenAI/Public/Models/Models/ModelResult.swift b/Sources/OpenAI/Public/Models/Models/ModelResult.swift index b6e7bca7..13a0fe17 100644 --- a/Sources/OpenAI/Public/Models/Models/ModelResult.swift +++ b/Sources/OpenAI/Public/Models/Models/ModelResult.swift @@ -19,3 +19,5 @@ public struct ModelResult: Codable, Equatable { case ownedBy = "owned_by" } } + +extension ModelResult: Identifiable {}