Commit b8f8d237 authored by Steven杜宇's avatar Steven杜宇

// AI

parent 6fc03451
...@@ -11,6 +11,7 @@ import UIKit ...@@ -11,6 +11,7 @@ import UIKit
class YHAIChatConfiguration { class YHAIChatConfiguration {
static let defaultConfig = YHAIChatConfiguration() static let defaultConfig = YHAIChatConfiguration()
var disableHandleMessage: Bool = false
func registerMessageGroupCells(_ tableView: UITableView) { func registerMessageGroupCells(_ tableView: UITableView) {
...@@ -60,6 +61,12 @@ class YHAIChatConfiguration { ...@@ -60,6 +61,12 @@ class YHAIChatConfiguration {
func handleReceiveMessage(_ res: YHAIMessage?, _ done: Bool, _ messages: inout [YHAIMessage]) { func handleReceiveMessage(_ res: YHAIMessage?, _ done: Bool, _ messages: inout [YHAIMessage]) {
if disableHandleMessage {
for msg in messages {
msg.isDone = true
}
return
}
// 去除loading消息 // 去除loading消息
removeThinkingMessageFromChatList(&messages) removeThinkingMessageFromChatList(&messages)
......
...@@ -14,9 +14,11 @@ import JXSegmentedView ...@@ -14,9 +14,11 @@ import JXSegmentedView
class YHAIMainChatViewController: YHBaseViewController { class YHAIMainChatViewController: YHBaseViewController {
var robotId: String = "" var robotId: String = ""
var messages:[YHAIMessage] = [] var messages:[YHAIMessage] = []
let manager = YHAIRequestManager()
var conversationId: String = ""
lazy var tableView: UITableView = { lazy var tableView: UITableView = {
let tableView = UITableView(frame:.zero, style:.grouped) let tableView = UITableView(frame:.zero, style:.grouped)
...@@ -40,24 +42,43 @@ class YHAIMainChatViewController: YHBaseViewController { ...@@ -40,24 +42,43 @@ class YHAIMainChatViewController: YHBaseViewController {
v.sendBlock = { v.sendBlock = {
[weak self] text in [weak self] text in
guard let self = self else { return } guard let self = self else { return }
YHAIChatConfiguration.defaultConfig.disableHandleMessage = false
YHAIChatConfiguration.defaultConfig.removeThinkingMessageFromChatList(&messages) YHAIChatConfiguration.defaultConfig.removeThinkingMessageFromChatList(&messages)
let question = YHAIMessage.createQuestionMessage(text) let question = YHAIMessage.createQuestionMessage(text)
messages.append(question) messages.append(question)
messages.append(thinkingMessage) messages.append(thinkingMessage)
self.scrollToBottom() self.scrollToBottom()
YHAIRequestManager.shared.getMainChatConversationId { manager.getMainChatConversationId {
sesseionId in sesseionId in
YHAIRequestManager.shared.requestAI(botId: self.robotId, conversationId: sesseionId, question:text) { self.conversationId = sesseionId
self.bottomInputView.status = .loading
YHAIChatConfiguration.defaultConfig.disableHandleMessage = true
self.manager.requestAI(botId: self.robotId, conversationId: sesseionId, question:text) {
[weak self] res, done in [weak self] res, done in
guard let self = self else { return } guard let self = self else { return }
YHAIChatConfiguration.defaultConfig.handleReceiveMessage(res, done, &messages) YHAIChatConfiguration.defaultConfig.handleReceiveMessage(res, done, &messages)
if done {
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
}
self.scrollToBottom() self.scrollToBottom()
} }
} }
} }
v.stopSendBlock = {
[weak self] in
guard let self = self else { return }
self.manager.stopChat(chatId: self.manager.chatId, conversationId: self.conversationId) { success, error in
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
if success {
YHAIChatConfiguration.defaultConfig.disableHandleMessage = true
YHAIChatConfiguration.defaultConfig.removeThinkingMessageFromChatList(&self.messages)
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
self.tableView.reloadData()
}
}
}
return v return v
}() }()
......
...@@ -12,7 +12,6 @@ import SmartCodable ...@@ -12,7 +12,6 @@ import SmartCodable
class YHAIRequestManager: NSObject { class YHAIRequestManager: NSObject {
static let shared = YHAIRequestManager()
static let sessionKey = "YINHE_SESSION_KEY" static let sessionKey = "YINHE_SESSION_KEY"
var sessionId: String = "" var sessionId: String = ""
...@@ -120,6 +119,28 @@ class YHAIRequestManager: NSObject { ...@@ -120,6 +119,28 @@ class YHAIRequestManager: NSObject {
} }
} }
func stopChat(chatId: String, conversationId: String, callBackBlock:@escaping (_ success: Bool,_ error:YHErrorModel?)->()) {
let url = YHBaseUrlManager.shared.curURL() + YHAllApiName.AIChat.cancelAIChat
let param = ["chatId" : chatId,
"conversationId" : conversationId] as! [String: Any]
let _ = YHNetRequest.postRequest(url: url, params: param) { [weak self] json, code in
//1. json字符串 转 对象
guard let self = self else { return }
printLog("model 是 ==> \(json)")
if json.code == 200 {
callBackBlock(true,nil)
} else {
let err = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg.isEmpty ? "" : json.msg)
callBackBlock(false,err)
}
} failBlock: { err in
callBackBlock(false,err)
}
}
func dictionaryToHttpBodyStream(_ dic: [String: Any]) -> InputStream? { func dictionaryToHttpBodyStream(_ dic: [String: Any]) -> InputStream? {
do { do {
// 将字典序列化为 JSON 数据 // 将字典序列化为 JSON 数据
......
...@@ -14,9 +14,10 @@ class YHAIRobotChatViewController: YHBaseViewController { ...@@ -14,9 +14,10 @@ class YHAIRobotChatViewController: YHBaseViewController {
var robotId: String = "" var robotId: String = ""
var conversationId: String = "" var conversationId: String = ""
var messages:[YHAIMessage] = [] var messages:[YHAIMessage] = []
let manager = YHAIRequestManager()
lazy var tableView: UITableView = { lazy var tableView: UITableView = {
let tableView = UITableView(frame:.zero, style:.grouped) let tableView = UITableView(frame:.zero, style:.grouped)
...@@ -51,13 +52,29 @@ class YHAIRobotChatViewController: YHBaseViewController { ...@@ -51,13 +52,29 @@ class YHAIRobotChatViewController: YHBaseViewController {
messages.append(question) messages.append(question)
messages.append(thinkingMessage) messages.append(thinkingMessage)
self.scrollToBottom() self.scrollToBottom()
self.bottomInputView.status = .loading
YHAIRequestManager.shared.requestAI(botId: self.robotId, conversationId: self.conversationId, question:text) { YHAIChatConfiguration.defaultConfig.disableHandleMessage = true
self.manager.requestAI(botId: self.robotId, conversationId: self.conversationId, question:text) {
[weak self] res, done in [weak self] res, done in
guard let self = self else { return } guard let self = self else { return }
YHAIChatConfiguration.defaultConfig.handleReceiveMessage(res, done, &messages) YHAIChatConfiguration.defaultConfig.handleReceiveMessage(res, done, &messages)
if done {
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
}
self.scrollToBottom() self.scrollToBottom()
}
}
v.stopSendBlock = {
[weak self] in
guard let self = self else { return }
self.manager.stopChat(chatId: self.manager.chatId, conversationId: self.conversationId) { success, error in
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
if success {
YHAIChatConfiguration.defaultConfig.disableHandleMessage = true
YHAIChatConfiguration.defaultConfig.removeThinkingMessageFromChatList(&self.messages)
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
self.tableView.reloadData()
}
} }
} }
return v return v
......
...@@ -15,6 +15,7 @@ class YHAIServiceListViewController: YHBaseViewController { ...@@ -15,6 +15,7 @@ class YHAIServiceListViewController: YHBaseViewController {
var serviceArr: [YHEntranceconfigModel] = [] var serviceArr: [YHEntranceconfigModel] = []
let viewModel = YHAIViewModel() let viewModel = YHAIViewModel()
let manager = YHAIRequestManager()
lazy var collectionView: UICollectionView = { lazy var collectionView: UICollectionView = {
...@@ -139,7 +140,7 @@ extension YHAIServiceListViewController: UICollectionViewDelegate, UICollectionV ...@@ -139,7 +140,7 @@ extension YHAIServiceListViewController: UICollectionViewDelegate, UICollectionV
if 0 <= indexPath.item && indexPath.item < serviceArr.count { if 0 <= indexPath.item && indexPath.item < serviceArr.count {
let model = serviceArr[indexPath.item] let model = serviceArr[indexPath.item]
YHHUD.show(.progress(message: "加载中...")) YHHUD.show(.progress(message: "加载中..."))
YHAIRequestManager.shared.getMainChatConversationId { self.manager.getMainChatConversationId {
sesseionId in sesseionId in
YHHUD.hide() YHHUD.hide()
let vc = YHAIRobotChatViewController() let vc = YHAIRobotChatViewController()
......
...@@ -7,12 +7,42 @@ ...@@ -7,12 +7,42 @@
// //
import UIKit import UIKit
import Lottie
import IQKeyboardManagerSwift import IQKeyboardManagerSwift
enum YHAITextInputStatus: Int {
case enableSend = 0
case disableSend = 1
case loading = 2
}
class YHAITextInputView: UIView { class YHAITextInputView: UIView {
var sendBlock: ((String)->())? var sendBlock: ((String)->())?
var stopSendBlock: (()->())?
var keyBoardChangeBlock: ((_ isShow: Bool)->())?
var status: YHAITextInputStatus = .enableSend {
didSet {
if status == .enableSend {
sendBtn.alpha = 1.0
sendBtn.isEnabled = true
sendBtn.isHidden = false
loadingImgView.isHidden = true
} else if status == .disableSend {
sendBtn.alpha = 0.3
sendBtn.isEnabled = false
sendBtn.isHidden = false
loadingImgView.isHidden = true
} else if status == .loading {
sendBtn.isHidden = true
loadingImgView.isHidden = false
}
}
}
lazy var contentView: UIView = { lazy var contentView: UIView = {
let v = UIView() let v = UIView()
v.layer.cornerRadius = 12.0 v.layer.cornerRadius = 12.0
...@@ -32,20 +62,37 @@ class YHAITextInputView: UIView { ...@@ -32,20 +62,37 @@ class YHAITextInputView: UIView {
btn.setImage(UIImage(named: "ai_chat_send"), for: .normal) btn.setImage(UIImage(named: "ai_chat_send"), for: .normal)
btn.addTarget(self, action: #selector(didSendButtonClicked), for: .touchUpInside) btn.addTarget(self, action: #selector(didSendButtonClicked), for: .touchUpInside)
btn.YH_clickEdgeInsets = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20) btn.YH_clickEdgeInsets = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)
btn.alpha = 0.3
btn.isEnabled = false
return btn return btn
}() }()
lazy var loadingImgView: LottieAnimationView! = {
let lottieView = LottieAnimationView(name: "ai_chat_input_pause")
lottieView.loopMode = .loop
lottieView.contentMode = .scaleAspectFit
lottieView.play()
lottieView.isHidden = true
let btn = UIButton(type: .custom)
btn.YH_clickEdgeInsets = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)
btn.addTarget(self, action: #selector(didStopSendBtnClicked), for: .touchUpInside)
lottieView.addSubview(btn)
btn.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
return lottieView
}()
@objc func didSendButtonClicked() { @objc func didSendButtonClicked() {
sendBlock?(textView.text) sendBlock?(textView.text)
status = .loading
textView.text = "" textView.text = ""
textView.isScrollEnabled = false textView.isScrollEnabled = false
sendBtn.alpha = 0.3
sendBtn.isEnabled = false
self.endEditing(true) self.endEditing(true)
} }
@objc func didStopSendBtnClicked() {
stopSendBlock?()
}
lazy var textView: YHAutoTextView = { lazy var textView: YHAutoTextView = {
let v = YHAutoTextView() let v = YHAutoTextView()
v.backgroundColor = .clear v.backgroundColor = .clear
...@@ -53,8 +100,9 @@ class YHAITextInputView: UIView { ...@@ -53,8 +100,9 @@ class YHAITextInputView: UIView {
v.textChange = { v.textChange = {
[weak self] text in [weak self] text in
guard let self = self else { return } guard let self = self else { return }
sendBtn.alpha = text.count > 0 ? 1.0 : 0.3 if status != .loading {
sendBtn.isEnabled = text.count > 0 status = text.count > 0 ? .enableSend : .disableSend
}
} }
return v return v
}() }()
...@@ -86,7 +134,9 @@ class YHAITextInputView: UIView { ...@@ -86,7 +134,9 @@ class YHAITextInputView: UIView {
self.addSubview(whiteView) self.addSubview(whiteView)
whiteView.addSubview(contentView) whiteView.addSubview(contentView)
contentView.addSubview(sendBtn) contentView.addSubview(sendBtn)
contentView.addSubview(loadingImgView)
contentView.addSubview(textView) contentView.addSubview(textView)
status = .disableSend
whiteView.snp.makeConstraints { make in whiteView.snp.makeConstraints { make in
make.edges.equalToSuperview() make.edges.equalToSuperview()
...@@ -106,6 +156,10 @@ class YHAITextInputView: UIView { ...@@ -106,6 +156,10 @@ class YHAITextInputView: UIView {
make.bottom.equalTo(-10) make.bottom.equalTo(-10)
} }
loadingImgView.snp.makeConstraints { make in
make.edges.equalTo(sendBtn)
}
textView.snp.makeConstraints { make in textView.snp.makeConstraints { make in
make.left.equalTo(5) make.left.equalTo(5)
make.top.equalTo(11-YHAutoTextView.verticalGap) make.top.equalTo(11-YHAutoTextView.verticalGap)
......
...@@ -664,6 +664,7 @@ class YHAllApiName { ...@@ -664,6 +664,7 @@ class YHAllApiName {
static let aiProductList = "super-app/ai/agent/entrance" static let aiProductList = "super-app/ai/agent/entrance"
static let agentChat = "super-app/ai/agent/chat" static let agentChat = "super-app/ai/agent/chat"
static let getAIChatSessionId = "super-app/ai/agent/conversation" static let getAIChatSessionId = "super-app/ai/agent/conversation"
static let cancelAIChat = "super-app/ai/agent/chat-cancel"
} }
} }
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