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

// AI

parent 6fc03451
......@@ -11,6 +11,7 @@ import UIKit
class YHAIChatConfiguration {
static let defaultConfig = YHAIChatConfiguration()
var disableHandleMessage: Bool = false
func registerMessageGroupCells(_ tableView: UITableView) {
......@@ -60,6 +61,12 @@ class YHAIChatConfiguration {
func handleReceiveMessage(_ res: YHAIMessage?, _ done: Bool, _ messages: inout [YHAIMessage]) {
if disableHandleMessage {
for msg in messages {
msg.isDone = true
}
return
}
// 去除loading消息
removeThinkingMessageFromChatList(&messages)
......
......@@ -14,9 +14,11 @@ import JXSegmentedView
class YHAIMainChatViewController: YHBaseViewController {
var robotId: String = ""
var messages:[YHAIMessage] = []
let manager = YHAIRequestManager()
var conversationId: String = ""
lazy var tableView: UITableView = {
let tableView = UITableView(frame:.zero, style:.grouped)
......@@ -40,24 +42,43 @@ class YHAIMainChatViewController: YHBaseViewController {
v.sendBlock = {
[weak self] text in
guard let self = self else { return }
YHAIChatConfiguration.defaultConfig.disableHandleMessage = false
YHAIChatConfiguration.defaultConfig.removeThinkingMessageFromChatList(&messages)
let question = YHAIMessage.createQuestionMessage(text)
messages.append(question)
messages.append(thinkingMessage)
self.scrollToBottom()
YHAIRequestManager.shared.getMainChatConversationId {
manager.getMainChatConversationId {
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
guard let self = self else { return }
YHAIChatConfiguration.defaultConfig.handleReceiveMessage(res, done, &messages)
if done {
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
}
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
}()
......
......@@ -12,7 +12,6 @@ import SmartCodable
class YHAIRequestManager: NSObject {
static let shared = YHAIRequestManager()
static let sessionKey = "YINHE_SESSION_KEY"
var sessionId: String = ""
......@@ -21,7 +20,7 @@ class YHAIRequestManager: NSObject {
let prefix_event = "event:"
let prefix_data = "data:"
let viewModel = YHAIViewModel()
// 每次回答的唯一标识符
var uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
var chatId = UUID().uuidString + NSDate().timeIntervalSince1970.description
......@@ -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? {
do {
// 将字典序列化为 JSON 数据
......
......@@ -14,9 +14,10 @@ class YHAIRobotChatViewController: YHBaseViewController {
var robotId: String = ""
var conversationId: String = ""
var messages:[YHAIMessage] = []
let manager = YHAIRequestManager()
lazy var tableView: UITableView = {
let tableView = UITableView(frame:.zero, style:.grouped)
......@@ -51,13 +52,29 @@ class YHAIRobotChatViewController: YHBaseViewController {
messages.append(question)
messages.append(thinkingMessage)
self.scrollToBottom()
YHAIRequestManager.shared.requestAI(botId: self.robotId, conversationId: self.conversationId, question:text) {
self.bottomInputView.status = .loading
YHAIChatConfiguration.defaultConfig.disableHandleMessage = true
self.manager.requestAI(botId: self.robotId, conversationId: self.conversationId, question:text) {
[weak self] res, done in
guard let self = self else { return }
YHAIChatConfiguration.defaultConfig.handleReceiveMessage(res, done, &messages)
if done {
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
}
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
......
......@@ -15,7 +15,8 @@ class YHAIServiceListViewController: YHBaseViewController {
var serviceArr: [YHEntranceconfigModel] = []
let viewModel = YHAIViewModel()
let manager = YHAIRequestManager()
lazy var collectionView: UICollectionView = {
let flowLayout = UICollectionViewFlowLayout()
......@@ -139,7 +140,7 @@ extension YHAIServiceListViewController: UICollectionViewDelegate, UICollectionV
if 0 <= indexPath.item && indexPath.item < serviceArr.count {
let model = serviceArr[indexPath.item]
YHHUD.show(.progress(message: "加载中..."))
YHAIRequestManager.shared.getMainChatConversationId {
self.manager.getMainChatConversationId {
sesseionId in
YHHUD.hide()
let vc = YHAIRobotChatViewController()
......
......@@ -7,12 +7,42 @@
//
import UIKit
import Lottie
import IQKeyboardManagerSwift
enum YHAITextInputStatus: Int {
case enableSend = 0
case disableSend = 1
case loading = 2
}
class YHAITextInputView: UIView {
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 = {
let v = UIView()
v.layer.cornerRadius = 12.0
......@@ -32,20 +62,37 @@ class YHAITextInputView: UIView {
btn.setImage(UIImage(named: "ai_chat_send"), for: .normal)
btn.addTarget(self, action: #selector(didSendButtonClicked), for: .touchUpInside)
btn.YH_clickEdgeInsets = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)
btn.alpha = 0.3
btn.isEnabled = false
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() {
sendBlock?(textView.text)
status = .loading
textView.text = ""
textView.isScrollEnabled = false
sendBtn.alpha = 0.3
sendBtn.isEnabled = false
self.endEditing(true)
}
@objc func didStopSendBtnClicked() {
stopSendBlock?()
}
lazy var textView: YHAutoTextView = {
let v = YHAutoTextView()
v.backgroundColor = .clear
......@@ -53,8 +100,9 @@ class YHAITextInputView: UIView {
v.textChange = {
[weak self] text in
guard let self = self else { return }
sendBtn.alpha = text.count > 0 ? 1.0 : 0.3
sendBtn.isEnabled = text.count > 0
if status != .loading {
status = text.count > 0 ? .enableSend : .disableSend
}
}
return v
}()
......@@ -86,7 +134,9 @@ class YHAITextInputView: UIView {
self.addSubview(whiteView)
whiteView.addSubview(contentView)
contentView.addSubview(sendBtn)
contentView.addSubview(loadingImgView)
contentView.addSubview(textView)
status = .disableSend
whiteView.snp.makeConstraints { make in
make.edges.equalToSuperview()
......@@ -106,6 +156,10 @@ class YHAITextInputView: UIView {
make.bottom.equalTo(-10)
}
loadingImgView.snp.makeConstraints { make in
make.edges.equalTo(sendBtn)
}
textView.snp.makeConstraints { make in
make.left.equalTo(5)
make.top.equalTo(11-YHAutoTextView.verticalGap)
......
......@@ -664,6 +664,7 @@ class YHAllApiName {
static let aiProductList = "super-app/ai/agent/entrance"
static let agentChat = "super-app/ai/agent/chat"
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