func postPrompt()

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()
    }