KMAIRequestServerManager.swift 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. //
  2. // KMAIRequestServerManager.swift
  3. // PDF Reader Pro Edition
  4. //
  5. // Created by wanjun on 2024/1/17.
  6. //
  7. import Cocoa
  8. import AFNetworking
  9. @objcMembers
  10. class ResultWrapper: NSObject {
  11. var success: Bool = false
  12. var result: NSDictionary = [:]
  13. var content: String = ""
  14. init(success: Bool, content: String) {
  15. self.success = success
  16. self.content = content
  17. self.result = NSDictionary.init()
  18. }
  19. init(success: Bool, resultData: NSDictionary) {
  20. self.success = success
  21. self.content = ""
  22. self.result = resultData
  23. }
  24. }
  25. @objc enum KMAIRewritingState : Int {
  26. case rewrite = 0 // 重写
  27. case correctTypos // 纠错
  28. case uploadTranslate // 翻译上传文件
  29. case fileTranslate // 翻译文件
  30. case textTranslate // 翻译文本
  31. case extractSummaryFile //摘要
  32. }
  33. @objc enum KMAIFileUploadState : Int {
  34. case Translation = 0
  35. case ExtractAbstract
  36. }
  37. //typealias KMRequestServerComplete = (_ success: Bool, _ result: Result?) -> Void
  38. @objcMembers class KMAIRequestServerManager: NSObject {
  39. static let defaultManager = KMAIRequestServerManager()
  40. typealias KMRequestServerComplete = (_ wrapper: ResultWrapper) -> Void
  41. private var downFileUrl: String = "" // 文件翻译
  42. var downFileName: String = "" // 文件翻译
  43. var fromLanguages: [String] = ["Automatic", "English", "Simplified Chinese", "Traditional Chinese", "Japanese", "Korean", "French", "Spanish", "Italian", "German", "Portuguese", "Russian", "Vietnamese", "Thai", "Arabic", "Greek", "Bulgarian", "Finnish", "Slovene", "Dutch", "Czech", "Swedish", "Polish", "Danish", "Romanian", "Hungarian"]
  44. var toLanguages: [String] = ["English", "Simplified Chinese", "Traditional Chinese", "Japanese", "Korean", "French", "Spanish", "Italian", "German", "Portuguese", "Russian", "Vietnamese", "Thai", "Arabic", "Greek", "Bulgarian", "Finnish", "Slovene", "Dutch", "Czech", "Swedish", "Polish", "Danish", "Romanian", "Hungarian"]
  45. // MARK: AI Action (public)
  46. func aiAction(content: String, state: KMAIRewritingState, from: String = "auto", to: String = "en", complete: @escaping KMRequestServerComplete) {
  47. if state == .rewrite || state == .correctTypos { //重写 && 纠错
  48. aiRewriting(content: content, state: state, complete: complete)
  49. } else if state == .uploadTranslate || state == .fileTranslate { // 上传文件 || 文件翻译
  50. aiTranslationFileUpload(file: content, complete: { [weak self] wrapper in
  51. let success: Bool = wrapper.success
  52. let fileKey = wrapper.content
  53. if success {
  54. let fileData = wrapper.result
  55. complete(wrapper)
  56. } else {
  57. complete(wrapper)
  58. }
  59. })
  60. } else if state == .textTranslate { // 文本翻译
  61. let aiInfo: AIInfo = AIInfoManager.default().aiInfo
  62. if aiInfo.totalToken - aiInfo.usedTimes > 1 {
  63. aiTranslationTextTrans(q: content, from: languageAbbreviation(from), to: languageAbbreviation(to), complete: complete)
  64. } else {
  65. aiMemberTranslationTextTrans(q: content, from: languageAbbreviation(from), to: languageAbbreviation(to), complete: complete)
  66. }
  67. } else if state == .extractSummaryFile { // 提取摘要
  68. let aiInfo: AIInfo = AIInfoManager.default().aiInfo
  69. if aiInfo.totalToken - aiInfo.usedTimes > 1 {
  70. extractSummaryFile(file: content, complete: complete)
  71. } else {
  72. }
  73. }
  74. }
  75. // MARK: Private
  76. private func uuid() -> String {
  77. return GetHardwareUUID()!
  78. }
  79. private func platform() -> String {
  80. var platform = "DMG"
  81. #if VERSION_DMG
  82. platform = "DMG"
  83. #else
  84. platform = "AiStore"
  85. #endif
  86. return platform
  87. }
  88. private func app_name() -> String {
  89. var bundleID: String!
  90. bundleID = Bundle.main.object(forInfoDictionaryKey: "CFBundleIdentifier") as! String
  91. return bundleID;
  92. }
  93. func downloadFile(filePath: String, downFileName: String, toPath: String, complete: @escaping KMRequestServerComplete) {
  94. self.downFileUrl = ""
  95. guard let fileURL = URL(string: filePath) else {
  96. let alert = NSAlert()
  97. alert.alertStyle = .critical
  98. alert.messageText = NSLocalizedString("Invalid file link", comment: "")
  99. alert.runModal()
  100. return
  101. }
  102. var destinationURL = FileManager.default.temporaryDirectory.appendingPathComponent(downFileName)
  103. if URL(fileURLWithPath: toPath) != nil {
  104. destinationURL = URL(fileURLWithPath: toPath)
  105. }
  106. if FileManager.default.fileExists(atPath: destinationURL.path) {
  107. do {
  108. try FileManager.default.removeItem(at: destinationURL)
  109. print("删除旧文件成功")
  110. } catch {
  111. print("删除旧文件失败:\(error)")
  112. }
  113. }
  114. let sessionConfiguration = URLSessionConfiguration.default
  115. let session = URLSession(configuration: sessionConfiguration)
  116. let downloadTask = session.downloadTask(with: fileURL) { (tempLocalURL, response, error) in
  117. if let error = error {
  118. let alert = NSAlert()
  119. alert.alertStyle = .critical
  120. alert.messageText = String(format: "%@:\(error)", NSLocalizedString("Download failed", comment: ""))
  121. alert.runModal()
  122. return
  123. }
  124. guard let tempLocalURL = tempLocalURL else {
  125. let alert = NSAlert()
  126. alert.alertStyle = .critical
  127. alert.messageText = NSLocalizedString("Invalid temporary directory", comment: "")
  128. alert.runModal()
  129. return
  130. }
  131. do {
  132. try FileManager.default.moveItem(at: tempLocalURL, to: destinationURL)
  133. let wrapper = ResultWrapper(success: true, content: "")
  134. wrapper.content = destinationURL.path
  135. complete(wrapper)
  136. } catch {
  137. let alert = NSAlert()
  138. alert.alertStyle = .critical
  139. alert.messageText = String(format: "%@:\(error)", NSLocalizedString("Failed to save file", comment: ""))
  140. alert.runModal()
  141. }
  142. }
  143. self.downFileUrl = destinationURL.path
  144. downloadTask.resume()
  145. }
  146. private func languageAbbreviation(_ language: String) -> String {
  147. if language == "Automatic" || language == "auto" {
  148. return "auto"
  149. } else if language == "English" || language == "en" {
  150. return "en"
  151. } else if language == "Simplified Chinese" || language == "zh" {
  152. return "zh"
  153. } else if language == "Traditional Chinese" || language == "cht" {
  154. return "cht"
  155. } else if language == "Japanese" || language == "jp" {
  156. return "jp"
  157. } else if language == "Korean" || language == "kor" {
  158. return "kor"
  159. } else if language == "French" || language == "fra" {
  160. return "fra"
  161. } else if language == "Spanish" || language == "spa" {
  162. return "spa"
  163. } else if language == "Italian" || language == "it" {
  164. return "it"
  165. } else if language == "German" || language == "de" {
  166. return "de"
  167. } else if language == "Portuguese" || language == "pt" {
  168. return "pt"
  169. } else if language == "Russian" || language == "ru" {
  170. return "ru"
  171. } else if language == "Vietnamese" || language == "vie" {
  172. return "vie"
  173. } else if language == "Thai" || language == "th" {
  174. return "th"
  175. } else if language == "Arabic" || language == "ara" {
  176. return "ara"
  177. } else if language == "Greek" || language == "el" {
  178. return "el"
  179. } else if language == "Bulgarian" || language == "bul" {
  180. return "bul"
  181. } else if language == "Finnish" || language == "fin" {
  182. return "fin"
  183. } else if language == "Slovene" || language == "slo" {
  184. return "slo"
  185. } else if language == "Dutch" || language == "nl" {
  186. return "nl"
  187. } else if language == "Czech" || language == "cs" {
  188. return "cs"
  189. } else if language == "Swedish" || language == "swe" {
  190. return "swe"
  191. } else if language == "Polish" || language == "pl" {
  192. return "pl"
  193. } else if language == "Danish" || language == "dan" {
  194. return "dan"
  195. } else if language == "Romanian" || language == "rom" {
  196. return "rom"
  197. } else if language == "Hungarian" || language == "hu" {
  198. return "hu"
  199. }
  200. return "auto"
  201. }
  202. // MARK: AI Action (private)
  203. /**
  204. @abstract 翻译上传
  205. @param file 文件路径
  206. @param complete 上传完成回调
  207. */
  208. private func aiTranslationFileUpload(file: String, complete: @escaping KMRequestServerComplete) {
  209. let infoDictionary = Bundle .main.infoDictionary!
  210. let urlString = AIInfoConfig().aiActionURL + "/api/AI/uploadTranslate"
  211. let fileData = FileManager.default.contents(atPath: file)
  212. let params: [String: Any] = ["file": fileData,
  213. "uuid": uuid(),
  214. "platform": platform(),
  215. "app_name": app_name(),
  216. "calculate":"1"]
  217. KMAIRequestServer.requestServer.uploadFile(urlString: urlString, params: params) { formData in
  218. let fileURL = URL(fileURLWithPath: file)
  219. try? formData.appendPart(withFileURL: fileURL, name: "file", fileName: fileURL.lastPathComponent, mimeType: "application/octet-stream")
  220. } requestSerializer: { requestSerializer in
  221. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  222. } completion: { task, responseObject, error in
  223. if responseObject != nil {
  224. let data: NSDictionary = responseObject!["data"] as? NSDictionary ?? [:]
  225. var code: String = responseObject!["code"] as? String ?? "06005"
  226. if code == "06005" {
  227. let tempCode: Int = responseObject!["code"] as? Int ?? 0
  228. if tempCode == 501 {
  229. code = "501"
  230. }
  231. }
  232. let message: String = responseObject!["message"] as? String ?? "unknown error"
  233. let error = NSError(domain: message, code: Int(code)!)
  234. if Int(code)! == 200 {
  235. let wrapper = ResultWrapper(success: true, resultData: data)
  236. wrapper.content = data["fileKey"] as! String
  237. complete(wrapper)
  238. } else {
  239. let wrapper = ResultWrapper(success: false, resultData: data)
  240. if Int(code)! == 501 {
  241. wrapper.content = "501"
  242. } else {
  243. wrapper.content = message
  244. }
  245. complete(wrapper)
  246. }
  247. } else {
  248. complete(ResultWrapper(success: false, content: "unknown error"))
  249. }
  250. }
  251. }
  252. private func aiMemberTranslationFileUpload(file: String, complete: @escaping KMRequestServerComplete) {
  253. let token: String = KMMemberInfo.shared.access_token
  254. if token == "" {
  255. return
  256. }
  257. let infoDictionary = Bundle .main.infoDictionary!
  258. let urlString = AIInfoConfig().aiActionURL + "/api/AI/uploadTranslate"
  259. let fileData = FileManager.default.contents(atPath: file)
  260. let params: [String: Any] = ["file": fileData,
  261. "uuid": uuid(),
  262. "platform": platform(),
  263. "app_name": app_name(),
  264. "calculate":"1"]
  265. KMAIRequestServer.requestServer.uploadFile(urlString: urlString, params: params) { formData in
  266. let fileURL = URL(fileURLWithPath: file)
  267. try? formData.appendPart(withFileURL: fileURL, name: "file", fileName: fileURL.lastPathComponent, mimeType: "application/octet-stream")
  268. } requestSerializer: { requestSerializer in
  269. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  270. } completion: { task, responseObject, error in
  271. if responseObject != nil {
  272. let data: NSDictionary = responseObject!["data"] as? NSDictionary ?? [:]
  273. var code: String = responseObject!["code"] as? String ?? "06005"
  274. if code == "06005" {
  275. let tempCode: Int = responseObject!["code"] as? Int ?? 0
  276. if tempCode == 501 {
  277. code = "501"
  278. }
  279. }
  280. let message: String = responseObject!["message"] as? String ?? "unknown error"
  281. let error = NSError(domain: message, code: Int(code)!)
  282. if Int(code)! == 200 {
  283. let wrapper = ResultWrapper(success: true, resultData: data)
  284. wrapper.content = data["fileKey"] as! String
  285. complete(wrapper)
  286. } else {
  287. let wrapper = ResultWrapper(success: false, resultData: data)
  288. if Int(code)! == 501 {
  289. wrapper.content = "501"
  290. } else {
  291. wrapper.content = message
  292. }
  293. complete(wrapper)
  294. }
  295. } else {
  296. complete(ResultWrapper(success: false, content: "unknown error"))
  297. }
  298. }
  299. }
  300. /**
  301. @abstract 文件翻译
  302. @param fileKey 文件Key
  303. @param from 初始语言
  304. @param to 结束语言
  305. */
  306. func aiTranslationFileTranslateHandle(fileKey: String, from: String, to: String, complete: @escaping KMRequestServerComplete) {
  307. let infoDictionary = Bundle .main.infoDictionary!
  308. let urlString = AIInfoConfig().aiActionURL + "/api/AI/fileTranslate"
  309. let paraDict = ["fileKey": fileKey,
  310. "from": languageAbbreviation(from),
  311. "to": languageAbbreviation(to),
  312. "uuid": uuid(),
  313. "platform": platform(),
  314. "app_name": app_name()]
  315. var postData = try! JSONSerialization.data(withJSONObject: paraDict)
  316. var request = URLRequest(url: URL(string: urlString)!,timeoutInterval: Double.infinity)
  317. request.addValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  318. request.addValue("application/json", forHTTPHeaderField: "Content-Type")
  319. request.httpMethod = "POST"
  320. request.httpBody = postData
  321. let task = URLSession.shared.dataTask(with: request) { data, response, error in
  322. guard let data = data else {
  323. print(String(describing: error))
  324. return
  325. }
  326. let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary ?? [:]
  327. if jsonObject != nil {
  328. let data1: NSDictionary = jsonObject!["data"] as? NSDictionary ?? [:]
  329. let code: String = jsonObject!["code"] as? String ?? "06005"
  330. let message: String = jsonObject!["message"] as? String ?? "unknown error"
  331. let error = NSError(domain: message, code: Int(code)!)
  332. if Int(code)! == 200 {
  333. let fileUrl = data1["fileUrl"]
  334. let downFileUrl = data1["downFileUrl"]
  335. let ossDownUrl = data1["ossDownUrl"]
  336. let fileName = data1["fileName"]
  337. let downFileName = data1["downFileName"]
  338. let fromStr = data1["from"]
  339. let toStr = data1["to"]
  340. self.downFileName = downFileName as! String
  341. complete(ResultWrapper(success: true, content: ossDownUrl as! String))
  342. } else {
  343. complete(ResultWrapper(success: false, content: message))
  344. }
  345. } else {
  346. complete(ResultWrapper(success: false, content: "unknown error"))
  347. }
  348. }
  349. task.resume()
  350. }
  351. /**
  352. @abstract 内容翻译
  353. @param q 选中
  354. @param from 初始语言
  355. @param to 结束语言
  356. */
  357. private func aiTranslationTextTrans(q: String, from: String, to: String, complete: @escaping KMRequestServerComplete) {
  358. let infoDictionary = Bundle .main.infoDictionary!
  359. let urlString = AIInfoConfig().aiActionURL + "/api/AI/textTranslate"
  360. var escapedString = q
  361. escapedString = String(data: escapedString.data(using: .utf8)!, encoding: .utf8)!
  362. let paraDict = ["text":escapedString,
  363. "from":from,
  364. "to":to,
  365. "uuid":uuid(),
  366. "platform": platform(),
  367. "app_name": app_name()]
  368. var postData = try! JSONSerialization.data(withJSONObject: paraDict)
  369. var request = URLRequest(url: URL(string: urlString)!,timeoutInterval: Double.infinity)
  370. request.addValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  371. request.addValue("application/json", forHTTPHeaderField: "Content-Type")
  372. request.httpMethod = "POST"
  373. request.httpBody = postData
  374. let task = URLSession.shared.dataTask(with: request) { data, response, error in
  375. guard let data = data else {
  376. print(String(describing: error))
  377. return
  378. }
  379. let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary ?? [:]
  380. if jsonObject != nil {
  381. let data1: NSDictionary = jsonObject!["data"] as? NSDictionary ?? [:]
  382. let code: String = jsonObject!["code"] as? String ?? "06005"
  383. let message: String = jsonObject!["message"] as? String ?? "unknown error"
  384. let error = NSError(domain: message, code: Int(code)!)
  385. if Int(code)! == 200 {
  386. var resultStr = data1["dst"] as! String
  387. complete(ResultWrapper(success: true, content: resultStr))
  388. } else {
  389. complete(ResultWrapper(success: false, content: message))
  390. }
  391. } else {
  392. complete(ResultWrapper(success: false, content: "unknown error"))
  393. }
  394. }
  395. task.resume()
  396. }
  397. private func aiMemberTranslationTextTrans(q: String, from: String, to: String, complete: @escaping KMRequestServerComplete) {
  398. let token: String = KMMemberInfo.shared.access_token
  399. if token == "" {
  400. return
  401. }
  402. let urlString = AIInfoConfig().memberAIActionURL + "/member-system-website/v1/translate/textTrans"
  403. var escapedString = q
  404. escapedString = String(data: escapedString.data(using: .utf8)!, encoding: .utf8)!
  405. let paraDict = ["text":escapedString,
  406. "from":from,
  407. "to":to,
  408. "uuid":uuid(),
  409. "platform": platform(),
  410. "app_name": app_name()]
  411. var postData = try! JSONSerialization.data(withJSONObject: paraDict)
  412. KMAIRequestServer.requestServer.aiMemberRewriting(urlString: urlString, params: paraDict) { formData in
  413. } requestSerializer: { requestSerializer in
  414. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  415. requestSerializer.setValue("Bearer " + token, forHTTPHeaderField: "Authorization")
  416. } completion: { task, responseObject, error in
  417. if responseObject is KMMemberCenterResult {
  418. let resultObjct = responseObject as! KMMemberCenterResult
  419. let code = resultObjct.code
  420. let message: String = resultObjct.msg ?? ""
  421. if code == 200 {
  422. complete(ResultWrapper(success: true, content: message))
  423. } else {
  424. complete(ResultWrapper(success: false, content: message))
  425. }
  426. } else {
  427. complete(ResultWrapper(success: false, content: "unknown error"))
  428. }
  429. }
  430. }
  431. /**
  432. @abstract重写 & 纠错
  433. @param content 内容
  434. @param state 类型
  435. */
  436. private func aiRewriting(content: String, state: KMAIRewritingState, complete: @escaping KMRequestServerComplete) {
  437. let aiInfo: AIInfo = AIInfoManager.default().aiInfo
  438. if aiInfo.totalToken - aiInfo.usedTimes > 1 {
  439. var urlString = AIInfoConfig().aiActionURL + "/api/AI/rewrite"
  440. if state == .correctTypos {
  441. urlString = AIInfoConfig().aiActionURL + "/api/AI/correctTypos"
  442. }
  443. let params: [String: Any] = ["content": content,
  444. "uuid": uuid(),
  445. "platform": platform(),
  446. "app_name": app_name()]
  447. KMAIRequestServer.requestServer.aiRewriting(urlString: urlString, params: params) { formData in
  448. } requestSerializer: { requestSerializer in
  449. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  450. } completion: { task, responseObject, error in
  451. if responseObject != nil {
  452. let data: NSDictionary = responseObject!["data"] as? NSDictionary ?? [:]
  453. let code: String = responseObject!["code"] as? String ?? "06005"
  454. let message: String = responseObject!["message"] as? String ?? "unknown error"
  455. if Int(code)! == 200 {
  456. complete(ResultWrapper(success: true, content: data["content"] as! String))
  457. } else {
  458. complete(ResultWrapper(success: false, content: message))
  459. }
  460. } else {
  461. complete(ResultWrapper(success: false, content: "unknown error"))
  462. }
  463. }
  464. } else {
  465. let token: String = KMMemberInfo.shared.access_token
  466. if token == "" {
  467. return
  468. }
  469. var urlString = AIInfoConfig().memberAIActionURL + "/member-system-website/api/rewrite"
  470. if state == .correctTypos {
  471. urlString = AIInfoConfig().memberAIActionURL + "/member-system-website/api/correct-typos"
  472. }
  473. let params: [String: Any] = ["content": content]
  474. KMAIRequestServer.requestServer.aiMemberRewriting(urlString: urlString, params: params) { formData in
  475. } requestSerializer: { requestSerializer in
  476. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  477. requestSerializer.setValue("Bearer " + token, forHTTPHeaderField: "Authorization")
  478. } completion: { task, responseObject, error in
  479. if responseObject is KMMemberCenterResult {
  480. let resultObjct = responseObject as! KMMemberCenterResult
  481. let code = resultObjct.code
  482. let message: String = resultObjct.msg ?? ""
  483. if code == 200 {
  484. complete(ResultWrapper(success: true, content: message))
  485. } else {
  486. complete(ResultWrapper(success: false, content: message))
  487. }
  488. } else {
  489. complete(ResultWrapper(success: false, content: "unknown error"))
  490. }
  491. }
  492. }
  493. }
  494. /**
  495. @abstract 提取摘要
  496. @param file 文件路径
  497. */
  498. private func extractSummaryFile(file: String, complete: @escaping KMRequestServerComplete) {
  499. let infoDictionary = Bundle .main.infoDictionary!
  500. let urlString = AIInfoConfig().aiActionURL + "/api/AI/extractSummaryFile"
  501. let fileData = FileManager.default.contents(atPath: file)
  502. let params: [String: Any] = ["file": fileData,
  503. "uuid": uuid(),
  504. "platform": platform(),
  505. "app_name": app_name()]
  506. KMAIRequestServer.requestServer.uploadFile(urlString: urlString, params: params) { formData in
  507. let fileURL = URL(fileURLWithPath: file)
  508. try? formData.appendPart(withFileURL: fileURL, name: "file", fileName: fileURL.lastPathComponent, mimeType: "application/octet-stream")
  509. } requestSerializer: { requestSerializer in
  510. requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  511. } completion: { task, responseObject, error in
  512. if responseObject != nil {
  513. let data: NSDictionary = responseObject!["data"] as? NSDictionary ?? [:]
  514. let code: Int = responseObject!["code"] as? Int ?? 06005
  515. let message: String = responseObject!["message"] as? String ?? "unknown error"
  516. let error = NSError(domain: message, code: code)
  517. if code == 200 {
  518. complete(ResultWrapper(success: true, content: data["summary"] as! String))
  519. } else {
  520. complete(ResultWrapper(success: false, content: message))
  521. }
  522. } else {
  523. let error = NSError(domain: "unknown error", code: 404)
  524. complete(ResultWrapper(success: false, content: "unknown error"))
  525. }
  526. }
  527. }
  528. }
  529. //typealias KMHttpRequestServerComplete = (_ task: URLSessionDataTask?, _ responseObject: AnyObject?, _ error: NSError?) -> Void
  530. class KMAIRequestServer {
  531. var sessionManager: AFHTTPSessionManager!
  532. static let requestServer = KMAIRequestServer()
  533. var task: URLSessionTask?
  534. init() {
  535. let configuration: URLSessionConfiguration = URLSessionConfiguration.default
  536. sessionManager = AFHTTPSessionManager.init(sessionConfiguration: configuration)
  537. sessionManager.securityPolicy = AFSecurityPolicy.default()
  538. }
  539. /**
  540. 上传文件
  541. - 翻译
  542. - 摘要提取
  543. */
  544. func uploadFile(urlString: String,
  545. params: Dictionary<String, Any>?,
  546. body: ((_ formData:AFMultipartFormData) -> Void)?,
  547. requestSerializer: ((_ requestSerializer:AFHTTPRequestSerializer) -> Void)?,
  548. completion: KMHttpRequestServerComplete?) -> Void {
  549. sessionManager.requestSerializer.setValue("multipart/form-data", forHTTPHeaderField: "Content-Type")
  550. sessionManager.requestSerializer.timeoutInterval = 60
  551. sessionManager.responseSerializer = AFJSONResponseSerializer()
  552. sessionManager.responseSerializer.acceptableContentTypes = ["application/json","text/html","text/json","text/javascript","text/plain","image/gif"]
  553. if (requestSerializer != nil) {
  554. requestSerializer!(sessionManager.requestSerializer);
  555. }
  556. if (body != nil) {
  557. self.task = sessionManager.post(urlString, parameters: params, headers: nil) { formData in
  558. body!(formData)
  559. } progress: { progress in
  560. } success: { task, responseObject in
  561. let responseObject = responseObject as AnyObject
  562. if (completion != nil) {
  563. completion!(task,responseObject,nil);
  564. }
  565. } failure: { task, error in
  566. if (completion != nil) {
  567. completion!(task, nil, error as NSError);
  568. }
  569. }
  570. } else {
  571. self.task = sessionManager.post(urlString, parameters: params, headers: nil) { progress in
  572. } success: { task, responseObject in
  573. if (completion != nil) {
  574. let responseObject = responseObject as AnyObject
  575. completion!(task,responseObject,nil);
  576. }
  577. } failure: { task, error in
  578. if (completion != nil) {
  579. completion!(task, nil, error as NSError);
  580. }
  581. }
  582. }
  583. }
  584. func memberUploadFile(urlString: String,
  585. params: Dictionary<String, Any>?,
  586. body: ((_ formData:AFMultipartFormData) -> Void)?,
  587. requestSerializer: ((_ requestSerializer:AFHTTPRequestSerializer) -> Void)?,
  588. completion: KMHttpRequestServerComplete?) -> Void {
  589. sessionManager.requestSerializer.setValue("multipart/form-data", forHTTPHeaderField: "Content-Type")
  590. sessionManager.requestSerializer.timeoutInterval = 60
  591. sessionManager.responseSerializer = AFJSONResponseSerializer()
  592. sessionManager.responseSerializer.acceptableContentTypes = ["application/json","text/html","text/json","text/javascript","text/plain","image/gif"]
  593. if (requestSerializer != nil) {
  594. requestSerializer!(sessionManager.requestSerializer);
  595. }
  596. if (body != nil) {
  597. self.task = sessionManager.post(urlString, parameters: params, headers: nil) { formData in
  598. body!(formData)
  599. } progress: { progress in
  600. } success: { task, responseObject in
  601. let responseObject = responseObject as AnyObject
  602. if (completion != nil) {
  603. completion!(task,responseObject,nil);
  604. }
  605. } failure: { task, error in
  606. if (completion != nil) {
  607. completion!(task, nil, error as NSError);
  608. }
  609. }
  610. } else {
  611. self.task = sessionManager.post(urlString, parameters: params, headers: nil) { progress in
  612. } success: { task, responseObject in
  613. if (completion != nil) {
  614. let responseObject = responseObject as AnyObject
  615. completion!(task,responseObject,nil);
  616. }
  617. } failure: { task, error in
  618. if (completion != nil) {
  619. completion!(task, nil, error as NSError);
  620. }
  621. }
  622. }
  623. }
  624. /**
  625. 文件翻译
  626. */
  627. func aiFileTranslateHandle(urlString: String,
  628. params: Dictionary<String, Any>?,
  629. body: ((_ formData:AFMultipartFormData) -> Void)?,
  630. requestSerializer: ((_ requestSerializer:AFHTTPRequestSerializer) -> Void)?,
  631. completion: KMHttpRequestServerComplete?) -> Void {
  632. sessionManager.requestSerializer = AFJSONRequestSerializer()
  633. sessionManager.responseSerializer = AFJSONResponseSerializer()
  634. sessionManager.responseSerializer.acceptableContentTypes = ["application/json","text/html","text/json","text/javascript","text/plain","image/gif"]
  635. if (requestSerializer != nil) {
  636. requestSerializer!(sessionManager.requestSerializer);
  637. }
  638. if (body != nil) {
  639. self.task = sessionManager.post(urlString, parameters: params, headers: nil) { formData in
  640. body!(formData)
  641. } progress: { progress in
  642. } success: { task, responseObject in
  643. let responseObject = responseObject as AnyObject
  644. if (completion != nil) {
  645. completion!(task,responseObject,nil);
  646. }
  647. } failure: { task, error in
  648. if (completion != nil) {
  649. completion!(task, nil, error as NSError);
  650. }
  651. }
  652. } else {
  653. self.task = sessionManager.post(urlString, parameters: params, headers: nil) { progress in
  654. } success: { task, responseObject in
  655. if (completion != nil) {
  656. let responseObject = responseObject as AnyObject
  657. completion!(task,responseObject,nil);
  658. }
  659. } failure: { task, error in
  660. if (completion != nil) {
  661. completion!(task, nil, error as NSError);
  662. }
  663. }
  664. }
  665. }
  666. /**
  667. 重写
  668. */
  669. func aiRewriting(urlString: String,
  670. params: Dictionary<String, Any>?,
  671. body: ((_ formData:AFMultipartFormData) -> Void)?,
  672. requestSerializer: ((_ requestSerializer:AFHTTPRequestSerializer) -> Void)?,
  673. completion: KMHttpRequestServerComplete?) -> Void {
  674. sessionManager.requestSerializer.setValue("multipart/form-data", forHTTPHeaderField: "Content-Type")
  675. sessionManager.requestSerializer.timeoutInterval = 60
  676. sessionManager.responseSerializer = AFJSONResponseSerializer()
  677. sessionManager.responseSerializer.acceptableContentTypes = ["application/json","text/html","text/json","text/javascript","text/plain","image/gif"]
  678. if (requestSerializer != nil) {
  679. requestSerializer!(sessionManager.requestSerializer);
  680. }
  681. if (body != nil) {
  682. self.task = sessionManager.post(urlString, parameters: params, headers: nil) { formData in
  683. body!(formData)
  684. } progress: { progress in
  685. } success: { task, responseObject in
  686. let responseObject = responseObject as AnyObject
  687. if (completion != nil) {
  688. completion!(task,responseObject,nil);
  689. }
  690. } failure: { task, error in
  691. if (completion != nil) {
  692. completion!(task, nil, error as NSError);
  693. }
  694. }
  695. } else {
  696. self.task = sessionManager.post(urlString, parameters: params, headers: nil) { progress in
  697. } success: { task, responseObject in
  698. if (completion != nil) {
  699. let responseObject = responseObject as AnyObject
  700. completion!(task,responseObject,nil);
  701. }
  702. } failure: { task, error in
  703. if (completion != nil) {
  704. completion!(task, nil, error as NSError);
  705. }
  706. }
  707. }
  708. }
  709. func aiMemberRewriting(urlString: String,
  710. params: Dictionary<String, Any>?,
  711. body: ((_ formData:AFMultipartFormData) -> Void)?,
  712. requestSerializer: ((_ requestSerializer:AFHTTPRequestSerializer) -> Void)?,
  713. completion: KMHttpRequestServerComplete?) -> Void {
  714. let token: String = KMMemberInfo.shared.access_token
  715. let urlString = urlString
  716. let paraDict: [String: Any] = params!
  717. let postData = try! JSONSerialization.data(withJSONObject: paraDict)
  718. var request = URLRequest(url: URL(string: urlString)!,timeoutInterval: Double.infinity)
  719. request.addValue("application/json", forHTTPHeaderField: "Content-Type")
  720. request.addValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
  721. request.addValue("Bearer " + token, forHTTPHeaderField: "Authorization")
  722. request.httpMethod = "POST"
  723. request.httpBody = postData
  724. let task = URLSession.shared.dataTask(with: request) { data, response, error in
  725. guard let data = data else {
  726. print(String(describing: error))
  727. return
  728. }
  729. let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary ?? [:]
  730. if jsonObject != nil {
  731. let codeStr: String = jsonObject!["code"] as! String
  732. var code: Int = 0
  733. if let numCode = Int(codeStr) {
  734. code = numCode
  735. }
  736. var result_bool: Bool = true
  737. var message: String = ""
  738. if let string = jsonObject!["data"] {
  739. let dataDic = jsonObject!["data"] as? NSDictionary ?? [:]
  740. if let dataStr = dataDic["content"] {
  741. message = dataStr as! String
  742. result_bool = true
  743. }
  744. }
  745. let result = KMMemberCenterResult(code: code, msg: message, result: result_bool)
  746. if code == 200 {
  747. if (completion != nil) {
  748. completion!(nil, result, nil);
  749. }
  750. } else {
  751. if (completion != nil) {
  752. completion!(nil, nil, error as? NSError);
  753. }
  754. }
  755. } else {
  756. if (completion != nil) {
  757. completion!(nil, nil, error as? NSError);
  758. }
  759. }
  760. }
  761. task.resume()
  762. }
  763. }