Commit 35aef122 authored by Steven杜宇's avatar Steven杜宇

// AI

parent 0ba27ffe
......@@ -667,6 +667,7 @@
04B9EE5A2C06CC3100A4018D /* YHCodeSueecssViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B9EE582C06CC3100A4018D /* YHCodeSueecssViewController.swift */; };
04B9EE5B2C06CC3100A4018D /* YHOtherLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B9EE592C06CC3100A4018D /* YHOtherLoginViewController.swift */; };
04BD83452CCA2009003A88DF /* AlimamaShuHeiTi-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 04BD83442CCA2009003A88DF /* AlimamaShuHeiTi-Bold.ttf */; };
04BE39282CF848F300BD31DB /* YHAIMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BE39272CF848F300BD31DB /* YHAIMessageModel.swift */; };
04C693622B723AB8004C1758 /* YHMySettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04C693612B723AB8004C1758 /* YHMySettingViewController.swift */; };
04C693642B723B56004C1758 /* YHMySettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04C693632B723B56004C1758 /* YHMySettingCell.swift */; };
04C85DDF2C364FE9008B20D6 /* YHAboutUsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04C85DDE2C364FE9008B20D6 /* YHAboutUsCell.swift */; };
......@@ -1716,6 +1717,7 @@
04B9EE582C06CC3100A4018D /* YHCodeSueecssViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YHCodeSueecssViewController.swift; sourceTree = "<group>"; };
04B9EE592C06CC3100A4018D /* YHOtherLoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YHOtherLoginViewController.swift; sourceTree = "<group>"; };
04BD83442CCA2009003A88DF /* AlimamaShuHeiTi-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "AlimamaShuHeiTi-Bold.ttf"; sourceTree = "<group>"; };
04BE39272CF848F300BD31DB /* YHAIMessageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHAIMessageModel.swift; sourceTree = "<group>"; };
04C693612B723AB8004C1758 /* YHMySettingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMySettingViewController.swift; sourceTree = "<group>"; };
04C693632B723B56004C1758 /* YHMySettingCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMySettingCell.swift; sourceTree = "<group>"; };
04C85DDE2C364FE9008B20D6 /* YHAboutUsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHAboutUsCell.swift; sourceTree = "<group>"; };
......@@ -3953,6 +3955,7 @@
children = (
045F28492CF6F5B100520F19 /* YHAIViewModel.swift */,
045F284B2CF6F65200520F19 /* YHAIListModel.swift */,
04BE39272CF848F300BD31DB /* YHAIMessageModel.swift */,
);
path = M;
sourceTree = "<group>";
......@@ -5893,6 +5896,7 @@
045EEEBF2B9F171A0022A143 /* YHWorkFileItemView.swift in Sources */,
04AF58C42B4FC51C0066011A /* YHLocalizable.swift in Sources */,
0457921F2CBF62F300EBD99B /* YHResignUploadDetailModel.swift in Sources */,
04BE39282CF848F300BD31DB /* YHAIMessageModel.swift in Sources */,
04F4A5282CB8D4270026D469 /* YHResignAppointScheduleListViewController.swift in Sources */,
A598E9E22C7CB32D00F84739 /* YHTravelDocsPreparationListModel.swift in Sources */,
A598E9D72C7C9EF300F84739 /* YHTravelDocsPreparationListViewController.swift in Sources */,
......
......@@ -43,7 +43,7 @@ class YHAIChatViewController: YHBaseViewController {
messages.append(question)
self.scrollToBottom()
YHAIRequestManager.shared.requestAI(query: text) {
YHAIRequestManager.shared.requestAI(botId: "", conversationId: "", question:text) {
[weak self] res in
guard let self = self else { return }
self.handleMessage(res)
......
//
// YHAIMessageModel.swift
// galaxy
//
// Created by Dufet on 2024/11/28.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import SmartCodable
class YHAIMessageModel: NSObject {
}
enum YHAIResponseType: Int {
case none = 0
case text = 1
case card = 2
}
class YHAIMessage: CustomStringConvertible {
var id: String = ""
var event: String = ""
var data: [String : Any] = [:]
var uuid: String = ""
var isSelf: Bool = false
var body = YHAIResponseBody()
func isFinishd() -> Bool {
if event.isEmpty {
return true
}
if event == "conversation.message.completed" {
return true
}
return false
}
func setFinished() {
event = "conversation.message.completed"
}
static func createQuestion(_ text: String) -> YHAIMessage {
let question = YHAIMessage()
question.isSelf = true
let body = YHAIResponseBody()
body.contentType = 1
body.contentText = text
question.setFinished()
question.body = body
return question
}
func getType() -> YHAIResponseType {
if let type = data["contentType"] as? Int, type == 1 {
return .text
}
return .none
}
func getText() -> String {
if getType() == .text {
if let text = data["contentText"] as? String, !text.isEmpty {
return text
}
}
return ""
}
var description: String {
return "uudi:\(uuid)\n,id: \(id)\n, event: \(event)\n, data: \(data))\n\n"
}
}
class YHAIResponseBody: SmartCodable {
// "contentType":1,"contentText":"如何判断未来深圳的天气走势?","botId":"7439200648601714700","status":"completed"
var contentType: Int = 0
var contentText: String = ""
var botId: String = ""
var status: String = ""
required init() {
}
}
......@@ -10,119 +10,130 @@ import UIKit
import Alamofire
import SmartCodable
enum YHAIResponseType: Int {
case none = 0
case text = 1
case card = 2
}
class YHAIMessage: CustomStringConvertible {
var id: String = ""
var event: String = ""
var data: [String : Any] = [:]
class YHAIRequestManager: NSObject {
var uuid: String = ""
var isSelf: Bool = false
static let shared = YHAIRequestManager()
static let sessionKey = "YINHE_SESSION_KEY"
var body = YHAIResponseBody()
var sessionId: String = ""
func isFinishd() -> Bool {
if event.isEmpty {
return true
}
if event == "conversation.message.completed" {
return true
}
return false
}
let prefix_id = "id:"
let prefix_event = "event:"
let prefix_data = "data:"
let viewModel = YHAIViewModel()
func setFinished() {
event = "conversation.message.completed"
}
var uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
static func createQuestion(_ text: String) -> YHAIMessage {
let question = YHAIMessage()
question.isSelf = true
let body = YHAIResponseBody()
body.contentType = 1
body.contentText = text
question.setFinished()
question.body = body
return question
}
func getCommonHeaders() -> HTTPHeaders {
func getType() -> YHAIResponseType {
if let type = data["contentType"] as? Int, type == 1 {
return .text
}
return .none
}
var requestHeader = HTTPHeaders()
requestHeader.add(name: "Accept", value: "text/event-stream")
requestHeader.add(name: "Connection", value: "keep-alive")
requestHeader.add(name:"appid",value:"1")
let dateStr = String(Date().timeIntervalSince1970)
requestHeader.add(name:"timestamp",value:dateStr)
func getText() -> String {
if getType() == .text {
if let text = data["contentText"] as? String, !text.isEmpty {
return text
}
}
return ""
}
requestHeader.add(name:"app_platform",value:"iOS")
requestHeader.add(name:"app_os",value:"iOS")
let version = UIDevice.appVersion()
requestHeader.add(name:"app_version",value:version)
requestHeader.add(name:"app_channel",value:"appStore")
var description: String {
return "uudi:\(uuid)\n,id: \(id)\n, event: \(event)\n, data: \(data))\n\n"
}
}
requestHeader.add(name:"app_phoneModel",value:UIDevice.iPhoneModelName())
requestHeader.add(name:"os_version_name",value:UIDevice.iPhoneVersion())
class YHAIResponseBody: SmartCodable {
// "contentType":1,"contentText":"如何判断未来深圳的天气走势?","botId":"7439200648601714700","status":"completed"
var contentType: Int = 0
var contentText: String = ""
var botId: String = ""
var status: String = ""
requestHeader.add(name:"pass",value:"")
required init() {
let appkey = "958364f87222c200a72414f492bf0e26"
let signOrgiString = "appid=" + "1" + "&" + "timestamp=" + dateStr + "&" + "appkey=" + appkey
let sign = signOrgiString.md5()
print("sign = \(sign)")
requestHeader.add(name:"sign",value:sign)
requestHeader.add(name: "token", value: YHLoginManager.shared.userModel?.token ?? "-")
if !YHLoginManager.shared.deviceTokenModel.registerId.isEmpty {
requestHeader.add(name: "device-id", value: YHLoginManager.shared.deviceTokenModel.registerId)
}
return requestHeader
}
}
class YHAIRequestManager: NSObject {
static let shared = YHAIRequestManager()
let prefix_id = "id:"
let prefix_event = "event:"
let prefix_data = "data:"
func requestAI(botId: String, conversationId: String, question: String = "", completion: ((_: YHAIMessage) -> Void)?) {
self.getSessionId {
sesseionId in
var uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
let url = YHBaseUrlManager.shared.curURL() + YHAllApiName.AIChat.agentChat
self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
// body 请求体参数
var parameters = ["botId" : botId,
"conversationId" : conversationId,
"question" : question]
func requestAI(query: String = "", completion:((_ : YHAIMessage) ->())?) {
// var url = "http://192.168.52.250:9898/example
var url = YHBaseUrlManager.shared.curURL() + YHAllApiName.AIChat.agentChat + "?query=" + query
url = url.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!
parameters = ["botId": "7441190609433755702",
"conversationId": sesseionId,
"question": question] as! [String: String]
self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
AF.streamRequest(url).responseStreamString {
let headers = self.getCommonHeaders()
// 发送 POST 请求
AF.streamRequest(url,
method: .post,
headers: headers,
automaticallyCancelOnStreamError: false,
requestModifier: { request in
if let httpBodyStream = self.dictionaryToHttpBodyStream(parameters) {
request.httpBodyStream = httpBodyStream
}
}).responseStreamString {
[weak self] stream in
guard let self = self else { return }
switch stream.event {
case let .stream(result):
switch result {
case let .success(string):
// print(string)
print(string)
self.handle(dataString: string) {
[weak self] res in
// guard let self = self else { return }
res in
completion?(res)
}
case let .failure(error):
print("")
print("\(error)")
}
case let .complete(completion):
if let af_error = completion.error {
if let error = af_error.underlyingError {
print("\(error)")
} else {
print("&&&&&&&&&&&&&&&&&&&&&&&&&&&&")
print("\(af_error)")
}
} else if let res = completion.response {
print("&&&&&&&&&&&&&&&&&&&&&&&&&&&&")
print("\(res)")
} else {
print("response done")
}
}
}
}
}
func dictionaryToHttpBodyStream(_ dic: [String: Any]) -> InputStream? {
do {
// 将字典序列化为 JSON 数据
let jsonData = try JSONSerialization.data(withJSONObject: dic, options: [])
// 创建一个 InputStream
let stream = InputStream(data: jsonData)
return stream
} catch {
print("Error serializing dictionary to JSON: \(error)")
return nil
}
}
// 处理data字符串
func handle(dataString: String, completion:((_ : YHAIMessage) ->())?) {
......@@ -182,3 +193,21 @@ class YHAIRequestManager: NSObject {
}
}
}
extension YHAIRequestManager {
func getSessionId(completion:((String)->())?) {
if let sessionId = UserDefaults.standard.value(forKey: YHAIRequestManager.sessionKey) as? String, !sessionId.isEmpty {
completion?(sessionId)
} else {
self.viewModel.getConversationId { success, error in
let sessionId = self.viewModel.sessionId
UserDefaults.standard.set(sessionId, forKey: YHAIRequestManager.sessionKey)
UserDefaults.standard.synchronize()
completion?(self.viewModel.sessionId)
}
}
}
}
......@@ -83,7 +83,10 @@ class YHNetRequest: NSObject {
override init() {
super.init()
headers = YHNetRequest.getCommonHeaders()
}
static func getCommonHeaders() -> HTTPHeaders {
var requestHeader = HTTPHeaders()
requestHeader.add(name:"Conatent-Type",value:"application/json")
......@@ -114,7 +117,7 @@ class YHNetRequest: NSObject {
if !YHLoginManager.shared.deviceTokenModel.registerId.isEmpty {
requestHeader.add(name: "device-id", value: YHLoginManager.shared.deviceTokenModel.registerId)
}
headers = requestHeader
return requestHeader
}
func businessCode(_ code: String) -> Self {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment