import Cocoa let url = URL(string:"https://endpoint_name.openai.azure.com/openai/deployments/deployment_name/chat/completions?api-version=2023-05-15")!, prompt = "Do what you are told. No more, no less." struct Role: Codable { let role: String let content: String } struct Completion: Codable { let temperature: Float let messages: [Role] } struct Response: Codable { let id: String let object: String let created: Int let model: String let choices: [Choice] let usage: Usage } struct Choice: Codable { let finish_reason: String let index: Int let message: Message } struct Message: Codable { let role: String let content: String } struct Usage: Codable { let prompt_tokens: Int let completion_tokens: Int let total_tokens: Int } let data = Completion( temperature: 0.4, messages: [ Role(role:"system", content: prompt), Role(role:"user", content: "Say Hello") ] ) let encoder = JSONEncoder() if let jsonData = try? encoder.encode(data), let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) var request = URLRequest(url: url); request.httpMethod = "POST" request.httpBody = jsonData request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") request.setValue("an_api_key", forHTTPHeaderField: "api-key") let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { print(error?.localizedDescription ?? "No data") return } let decoder = JSONDecoder() do { let response = try decoder.decode(Response.self, from: data) print(response.choices[0].message.content) } catch { print("Error decoding JSON: \(error)") } } // note that this also makes it hard to handle control flow task.resume() }