Skip to content

Instantly share code, notes, and snippets.

@heartshare
Forked from MatthewWaller/SwiftUI+ChatGPT.swift
Created April 1, 2023 02:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save heartshare/db6ce4aa89862a0b90d91d315ca735af to your computer and use it in GitHub Desktop.
Save heartshare/db6ce4aa89862a0b90d91d315ca735af to your computer and use it in GitHub Desktop.
SwiftUI Meets ChatGPT
import SwiftUI
struct ContentView: View {
@StateObject var service = ChatGPTService()
@State var textResponse = ""
var body: some View {
VStack {
Text("Bot says: \(textResponse)")
Button {
Task {
let response = try await service.processPrompt(prompt: "Pretend to be a choose-your-own adventure book about Jurassic Park please.")
textResponse = response ?? ""
}
} label: {
Image(systemName: "globe")
.imageScale(.large)
.foregroundColor(.accentColor)
Text("Hello, world!")
}
.padding()
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
class ChatGPTService: ObservableObject {
let apiKey: String = "this is your api key"
let openAIURL = URL(string: "https://api.openai.com/v1/chat/completions")
public func processPrompt(
prompt: String
) async throws -> Optional<String> {
var request = URLRequest(url: self.openAIURL!)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer \(self.phoneNumber)", forHTTPHeaderField: "Authorization")
let httpBody: [String: Any] = [
"model": "gpt-3.5-turbo",
"messages" : [["role" : "user", "content": prompt]],
]
let httpBodyJson = try JSONSerialization.data(withJSONObject: httpBody, options: .prettyPrinted)
request.httpBody = httpBodyJson
let (data, _) = try await URLSession.shared.data(for: request)
let object = try? JSONSerialization.jsonObject(with: data)
let responseHandler = OpenAIResponseHandler()
let openAIResponse = responseHandler.decodeJson(data)
return openAIResponse?.choices.first?.message.content
}
struct OpenAIResponseHandler {
func decodeJson(_ data: Data) -> OpenAIResponse? {
let decoder = JSONDecoder()
do {
let product = try decoder.decode(OpenAIResponse.self, from: data)
return product
} catch {
print("Error decoding OpenAI API Response")
}
return nil
}
}
struct OpenAIResponse: Codable {
var id: String
var choices: [Choice]
}
struct Choice: Codable {
var index: Int
var finish_reason: String?
var message: Message
}
struct Message: Codable {
var role: String
var content: String
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment