in HuggingChat-Mac/Network/NetworkService.swift [242:303]
func postPrompt(reqBody: PromptRequestBody, conversationId: String) -> AnyPublisher<Data, HFError> {
let endpoint = "\(BASE_URL)/chat/conversation/\(conversationId)"
let boundary = UUID().uuidString
var request = URLRequest(url: URL(string: endpoint)!)
request.httpMethod = "POST"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
request.setValue(UserAgentBuilder.userAgent, forHTTPHeaderField: "User-Agent")
request.setValue("\(BASE_URL)", forHTTPHeaderField: "Origin")
var data = Data()
// Add the files. Add tools Document Parser if supported.
// TODO: Limit to 10MB per file otherwise error out
if let filePaths = reqBody.files {
for (_, filePath) in filePaths.enumerated() {
let fileURL = URL(fileURLWithPath: filePath)
let filename = fileURL.lastPathComponent
do {
let fileData = try Data(contentsOf: fileURL)
let base64String = fileData.base64EncodedString()
data.append("--\(boundary)\r\n".data(using: .utf8)!)
data.append("Content-Disposition: form-data; name=\"files\"; filename=\"base64;\(filename)\"\r\n".data(using: .utf8)!)
data.append("Content-Type: \(mimeType(for: fileURL))\r\n\r\n".data(using: .utf8)!)
data.append(base64String.data(using: .utf8)!)
data.append("\r\n".data(using: .utf8)!)
} catch {
print("Error reading file: \(error)")
}
}
}
// Create a cleaned request body without files for JSON
var cleanedReqBody = reqBody
cleanedReqBody.files = nil
// Add the JSON part
do {
let jsonData = try encoder.encode(cleanedReqBody)
data.append("--\(boundary)\r\n".data(using: .utf8)!)
data.append("Content-Disposition: form-data; name=\"data\"\r\n".data(using: .utf8)!)
data.append("Content-Type: application/json\r\n\r\n".data(using: .utf8)!)
data.append(jsonData)
data.append("\r\n".data(using: .utf8)!)
} catch {
return Fail(outputType: Data.self, failure: HFError.encodeError(error)).eraseToAnyPublisher()
}
// Add the final boundary
data.append("--\(boundary)--\r\n".data(using: .utf8)!)
request.httpBody = data
let task = self.session.dataTask(with: request)
task.delegate = self
return _update.eraseToAnyPublisher().handleEvents(receiveRequest: { _ in
task.resume()
})
.eraseToAnyPublisher()
}