paul-ai-assistant 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -0
- package/es/AssistantChat/AssistantChatApp/index.js +4 -2
- package/es/AssistantChat/AssistantChatCard/OperationCard/AigcTipsRender/index.js +1 -1
- package/es/AssistantChat/AssistantChatCard/OperationCard/FeedBack/index.js +21 -1
- package/es/AssistantChat/AssistantChatInput/index.scss +5 -0
- package/es/components/InspectionCard/index.js +1 -2
- package/es/context/index.js +220 -67
- package/es/hooks/index.js +1 -0
- package/es/hooks/useAutoSend.js +95 -0
- package/es/index.js +8 -1
- package/es/service/conversation.js +74 -0
- package/es/service/index.js +1 -0
- package/es/utils/apushAssistant.js +31 -20
- package/es/utils/im.js +395 -0
- package/es/utils/request.js +16 -12
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -43,6 +43,54 @@ function App() {
|
|
|
43
43
|
}
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
+
## API 参数
|
|
47
|
+
|
|
48
|
+
### customFeedbackRender
|
|
49
|
+
|
|
50
|
+
自定义点赞点踩组件渲染函数。如果不传入此参数,将使用默认的点赞点踩组件。
|
|
51
|
+
|
|
52
|
+
**类型定义:**
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
customFeedbackRender?: (props: {
|
|
56
|
+
feedbackValue?: { feedback: 'helpful' | 'unhelpful' };
|
|
57
|
+
onFeedback: (feedback: 'helpful' | 'unhelpful') => void;
|
|
58
|
+
message: any;
|
|
59
|
+
}) => ReactNode;
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**参数说明:**
|
|
63
|
+
|
|
64
|
+
| 参数 | 说明 | 类型 |
|
|
65
|
+
|------|------|------|
|
|
66
|
+
| feedbackValue | 当前反馈值 | `{ feedback: 'helpful' \| 'unhelpful' } \| undefined` |
|
|
67
|
+
| onFeedback | 反馈回调函数,调用后会提交反馈到服务端 | `(feedback: 'helpful' \| 'unhelpful') => void` |
|
|
68
|
+
| message | 当前消息的完整数据 | `any` |
|
|
69
|
+
|
|
70
|
+
**使用示例:**
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
<PaulAiAssistant
|
|
74
|
+
bizId="your-biz-id"
|
|
75
|
+
customFeedbackRender={({ feedbackValue, onFeedback }) => (
|
|
76
|
+
<div>
|
|
77
|
+
<button
|
|
78
|
+
onClick={() => onFeedback('helpful')}
|
|
79
|
+
style={{ color: feedbackValue?.feedback === 'helpful' ? 'green' : 'gray' }}
|
|
80
|
+
>
|
|
81
|
+
有帮助
|
|
82
|
+
</button>
|
|
83
|
+
<button
|
|
84
|
+
onClick={() => onFeedback('unhelpful')}
|
|
85
|
+
style={{ color: feedbackValue?.feedback === 'unhelpful' ? 'red' : 'gray' }}
|
|
86
|
+
>
|
|
87
|
+
没帮助
|
|
88
|
+
</button>
|
|
89
|
+
</div>
|
|
90
|
+
)}
|
|
91
|
+
/>
|
|
92
|
+
```
|
|
93
|
+
|
|
46
94
|
## 开发
|
|
47
95
|
|
|
48
96
|
### 环境要求
|
|
@@ -28,7 +28,8 @@ var AssistantChatApp = function AssistantChatApp(_, ref) {
|
|
|
28
28
|
toggleMessageSelection = _useContext.toggleMessageSelection,
|
|
29
29
|
isMessageSelected = _useContext.isMessageSelected,
|
|
30
30
|
canCancelSelection = _useContext.canCancelSelection,
|
|
31
|
-
enterShareMode = _useContext.enterShareMode
|
|
31
|
+
enterShareMode = _useContext.enterShareMode,
|
|
32
|
+
customFeedbackRender = _useContext.customFeedbackRender;
|
|
32
33
|
var chatListRef = useRef(null);
|
|
33
34
|
var stopScrollToEndRef = useRef(false);
|
|
34
35
|
var messageWidth = (MESSAGE_CARD_WIDTH === null || MESSAGE_CARD_WIDTH === void 0 ? void 0 : MESSAGE_CARD_WIDTH[messageCardWidth]) || messageCardWidth;
|
|
@@ -174,7 +175,8 @@ var AssistantChatApp = function AssistantChatApp(_, ref) {
|
|
|
174
175
|
meta: {
|
|
175
176
|
originData: message
|
|
176
177
|
}
|
|
177
|
-
}
|
|
178
|
+
},
|
|
179
|
+
customFeedbackRender: customFeedbackRender
|
|
178
180
|
})), /*#__PURE__*/React.createElement(AigcTipsRender, {
|
|
179
181
|
ctx: {
|
|
180
182
|
meta: {
|
|
@@ -9,7 +9,7 @@ var AigcTipsRender = function AigcTipsRender(props) {
|
|
|
9
9
|
var _ctx$meta;
|
|
10
10
|
var ctx = props.ctx,
|
|
11
11
|
_props$showAigcTips = props.showAigcTips,
|
|
12
|
-
showAigcTips = _props$showAigcTips === void 0 ?
|
|
12
|
+
showAigcTips = _props$showAigcTips === void 0 ? false : _props$showAigcTips;
|
|
13
13
|
var _ref = (ctx === null || ctx === void 0 || (_ctx$meta = ctx.meta) === null || _ctx$meta === void 0 ? void 0 : _ctx$meta.originData) || {},
|
|
14
14
|
dataInfo = _ref.dataInfo;
|
|
15
15
|
var headerTips = useMemo(function () {
|
|
@@ -14,7 +14,8 @@ export var FEEDBACK_TYPE = /*#__PURE__*/function (FEEDBACK_TYPE) {
|
|
|
14
14
|
}({}); // 点踩
|
|
15
15
|
var FeedBack = function FeedBack(props) {
|
|
16
16
|
var _ctx$meta, _headerInfo$props;
|
|
17
|
-
var ctx = props.ctx
|
|
17
|
+
var ctx = props.ctx,
|
|
18
|
+
customFeedbackRender = props.customFeedbackRender;
|
|
18
19
|
var _ref = (ctx === null || ctx === void 0 || (_ctx$meta = ctx.meta) === null || _ctx$meta === void 0 ? void 0 : _ctx$meta.originData) || {},
|
|
19
20
|
dialogId = _ref.dialogId,
|
|
20
21
|
subjectId = _ref.subjectId,
|
|
@@ -52,6 +53,25 @@ var FeedBack = function FeedBack(props) {
|
|
|
52
53
|
}
|
|
53
54
|
});
|
|
54
55
|
};
|
|
56
|
+
|
|
57
|
+
// 如果传入了自定义渲染函数,使用自定义组件
|
|
58
|
+
if (typeof customFeedbackRender === 'function') {
|
|
59
|
+
var _ctx$meta2;
|
|
60
|
+
return customFeedbackRender({
|
|
61
|
+
feedbackValue: feedBackValue,
|
|
62
|
+
onFeedback: function onFeedback(feedback) {
|
|
63
|
+
setFeedBackValue({
|
|
64
|
+
feedback: feedback
|
|
65
|
+
});
|
|
66
|
+
onChange({
|
|
67
|
+
feedback: feedback
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
message: ctx === null || ctx === void 0 || (_ctx$meta2 = ctx.meta) === null || _ctx$meta2 === void 0 ? void 0 : _ctx$meta2.originData
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// 默认渲染逻辑
|
|
55
75
|
return /*#__PURE__*/React.createElement(React.Fragment, null, feedBackValue && (feedBackValue === null || feedBackValue === void 0 ? void 0 : feedBackValue.feedback) === FEEDBACK_TYPE.HELPFUL ? /*#__PURE__*/React.createElement(CSECustomIcon, {
|
|
56
76
|
type: "icondianzan-mianxing",
|
|
57
77
|
size: "small",
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
.assistant-chat-paul-ai-bottom-reply {
|
|
13
13
|
width: 100%;
|
|
14
|
+
box-sizing: border-box;
|
|
14
15
|
background-color: #fff;
|
|
15
16
|
border: 1px solid #d4d6db;
|
|
16
17
|
border-radius: 6px;
|
|
@@ -32,6 +33,10 @@
|
|
|
32
33
|
box-shadow: none !important;
|
|
33
34
|
}
|
|
34
35
|
|
|
36
|
+
textarea:focus-visible {
|
|
37
|
+
outline: none;
|
|
38
|
+
}
|
|
39
|
+
|
|
35
40
|
.ant-input:focus {
|
|
36
41
|
box-shadow: none !important;
|
|
37
42
|
}
|
|
@@ -6,7 +6,6 @@ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
|
6
6
|
* @file 智能辅助-巡检报告卡片
|
|
7
7
|
*/
|
|
8
8
|
import React, { useContext, useState } from 'react';
|
|
9
|
-
import { Message } from '@alifd/next';
|
|
10
9
|
import { message } from 'antd';
|
|
11
10
|
import _ from 'lodash';
|
|
12
11
|
import AgentCardRender from "../../AssistantChat/AssistantChatCard/AgentCardRender";
|
|
@@ -84,7 +83,7 @@ var InspectionCard = function InspectionCard(props) {
|
|
|
84
83
|
setFormData(values);
|
|
85
84
|
setIsSubmitted(true);
|
|
86
85
|
} else {
|
|
87
|
-
|
|
86
|
+
message.error(response.message || '表单提交失败,请重试');
|
|
88
87
|
enableSubmit === null || enableSubmit === void 0 || enableSubmit(); // 重新启用提交按钮
|
|
89
88
|
}
|
|
90
89
|
_context.next = 13;
|
package/es/context/index.js
CHANGED
|
@@ -4,14 +4,14 @@ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
|
4
4
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
5
5
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
6
6
|
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
|
|
7
|
-
var _excluded = ["children", "bizId", "bizDomain", "locateAfterSingleMessageUpdate", "dataSource", "interruptLlmMessageScroll", "toolConfig", "placeholder", "messageCardWidth", "enableWsConnectCallback", "onSend", "assistantChat", "log", "logTrace", "messagesMaxLength", "mode", "activeToken", "onStopMessage", "imConnectCallback", "chatTitle", "isAssistant", "isThirdEmbed", "getApiHost"],
|
|
7
|
+
var _excluded = ["children", "bizId", "bizDomain", "locateAfterSingleMessageUpdate", "dataSource", "interruptLlmMessageScroll", "toolConfig", "placeholder", "messageCardWidth", "enableWsConnectCallback", "onSend", "assistantChat", "log", "logTrace", "messagesMaxLength", "mode", "activeToken", "onStopMessage", "imConnectCallback", "chatTitle", "isAssistant", "isThirdEmbed", "getApiHost", "subjectId", "autoConnect", "autoSendMessage", "onConnectionReady", "onSendSuccess", "onSendError"],
|
|
8
8
|
_excluded2 = ["chatType", "onSuccessCallback"];
|
|
9
9
|
import React, { createContext, useEffect, useRef, useState } from 'react';
|
|
10
10
|
import { event } from "../utils/event";
|
|
11
11
|
import { getWorkId } from "../utils/helpers";
|
|
12
12
|
import { FEATURE_MODE_TYPE_KEY } from "../components/ModelSelect/const";
|
|
13
13
|
import { ASSIST_CHAT_EVENT } from "../constants/assistChatEvent";
|
|
14
|
-
import { CHAT_TYPE, ChatTypeEnum, COPILOT_TOOL_TYPE_ENUM, initPlaceholder } from "../constants/common";
|
|
14
|
+
import { CHAT_TYPE, ChatTypeEnum, COPILOT_TOOL_TYPE_ENUM, initPlaceholder, REQUEST_SUCCESS_CODE } from "../constants/common";
|
|
15
15
|
import { LOG_TRACE_TYPE_ENUMS } from "../constants/logTrace";
|
|
16
16
|
import { ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS, disconnectAssistantWs, startAssistantWs } from "../utils/apushAssistant";
|
|
17
17
|
import { triggerPlugin } from "../utils/clientPlugin";
|
|
@@ -21,17 +21,53 @@ import { AesCustomLogEventEnum, setAesCustomEvent } from "../utils/log";
|
|
|
21
21
|
import { updateMessageList, updateMessageValue, updateSingleMessage } from "./utils/messages";
|
|
22
22
|
import { clickSendMessage, sendMessageRequest, stopMessage, successCallback } from "./utils/send";
|
|
23
23
|
import { clearContext, initTools, searchTools } from "./utils/tool";
|
|
24
|
+
import { getConversationConnection } from "../service/conversation";
|
|
25
|
+
import { useAutoSend } from "../hooks/useAutoSend";
|
|
26
|
+
|
|
27
|
+
// ======================================= URL 参数工具函数 =======================================
|
|
28
|
+
var SUBJECT_ID_URL_PARAM = 'subjectId';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 从 URL 中读取 subjectId 参数
|
|
32
|
+
*/
|
|
33
|
+
var getSubjectIdFromUrl = function getSubjectIdFromUrl() {
|
|
34
|
+
if (typeof window === 'undefined') return null;
|
|
35
|
+
var urlParams = new URLSearchParams(window.location.search);
|
|
36
|
+
return urlParams.get(SUBJECT_ID_URL_PARAM);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* 将 subjectId 写入 URL(使用 history.pushState 产生浏览历史)
|
|
41
|
+
* 只有当 URL 中的 subjectId 与传入的不同时才更新
|
|
42
|
+
*/
|
|
43
|
+
var updateUrlWithSubjectId = function updateUrlWithSubjectId(subjectId) {
|
|
44
|
+
if (typeof window === 'undefined') return;
|
|
45
|
+
|
|
46
|
+
// 获取当前 URL 中的 subjectId
|
|
47
|
+
var currentSubjectId = getSubjectIdFromUrl();
|
|
48
|
+
var newSubjectId = String(subjectId);
|
|
49
|
+
|
|
50
|
+
// 如果 subjectId 没有变化,不更新 URL
|
|
51
|
+
if (currentSubjectId === newSubjectId) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
var url = new URL(window.location.href);
|
|
55
|
+
url.searchParams.set(SUBJECT_ID_URL_PARAM, newSubjectId);
|
|
56
|
+
window.history.pushState({
|
|
57
|
+
subjectId: newSubjectId
|
|
58
|
+
}, '', url.toString());
|
|
59
|
+
};
|
|
24
60
|
export var AssistantChatContext = /*#__PURE__*/createContext({
|
|
25
61
|
bizId: '',
|
|
26
|
-
bizDomain: '
|
|
62
|
+
bizDomain: 'CHAT',
|
|
27
63
|
messagesLoading: true
|
|
28
64
|
});
|
|
29
65
|
var AssistantChatProvider = function AssistantChatProvider() {
|
|
30
66
|
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
31
67
|
var children = props.children,
|
|
32
|
-
|
|
68
|
+
propBizId = props.bizId,
|
|
33
69
|
_props$bizDomain = props.bizDomain,
|
|
34
|
-
bizDomain = _props$bizDomain === void 0 ? '
|
|
70
|
+
bizDomain = _props$bizDomain === void 0 ? 'CHAT' : _props$bizDomain,
|
|
35
71
|
_props$locateAfterSin = props.locateAfterSingleMessageUpdate,
|
|
36
72
|
locateAfterSingleMessageUpdate = _props$locateAfterSin === void 0 ? true : _props$locateAfterSin,
|
|
37
73
|
dataSource = props.dataSource,
|
|
@@ -45,7 +81,7 @@ var AssistantChatProvider = function AssistantChatProvider() {
|
|
|
45
81
|
_props$enableWsConnec = props.enableWsConnectCallback,
|
|
46
82
|
enableWsConnectCallback = _props$enableWsConnec === void 0 ? false : _props$enableWsConnec,
|
|
47
83
|
onSend = props.onSend,
|
|
48
|
-
|
|
84
|
+
propAssistantChat = props.assistantChat,
|
|
49
85
|
_props$log = props.log,
|
|
50
86
|
log = _props$log === void 0 ? setAesCustomEvent : _props$log,
|
|
51
87
|
logTrace = props.logTrace,
|
|
@@ -61,44 +97,63 @@ var AssistantChatProvider = function AssistantChatProvider() {
|
|
|
61
97
|
isAssistant = _props$isAssistant === void 0 ? false : _props$isAssistant,
|
|
62
98
|
isThirdEmbed = props.isThirdEmbed,
|
|
63
99
|
getApiHost = props.getApiHost,
|
|
100
|
+
subjectId = props.subjectId,
|
|
101
|
+
_props$autoConnect = props.autoConnect,
|
|
102
|
+
autoConnect = _props$autoConnect === void 0 ? true : _props$autoConnect,
|
|
103
|
+
autoSendMessage = props.autoSendMessage,
|
|
104
|
+
onConnectionReady = props.onConnectionReady,
|
|
105
|
+
onSendSuccess = props.onSendSuccess,
|
|
106
|
+
onSendError = props.onSendError,
|
|
64
107
|
otherProps = _objectWithoutProperties(props, _excluded);
|
|
108
|
+
|
|
109
|
+
// 内部维护的 bizId,支持自动获取会话时使用
|
|
110
|
+
var _useState = useState(propBizId),
|
|
111
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
112
|
+
internalBizId = _useState2[0],
|
|
113
|
+
setInternalBizId = _useState2[1];
|
|
114
|
+
// 实际使用的 bizId:优先使用外部传入的,其次使用内部状态
|
|
115
|
+
var bizId = propBizId || internalBizId;
|
|
116
|
+
// 标记是否已自动发送过消息
|
|
117
|
+
var autoSendDoneRef = useRef(false);
|
|
118
|
+
// 标记是否正在获取会话连接
|
|
119
|
+
var isConnectingRef = useRef(false);
|
|
65
120
|
// 是否受控数据
|
|
66
121
|
var hasDefaultDataSource = dataSource && Array.isArray(dataSource);
|
|
67
122
|
// 消息流
|
|
68
|
-
var
|
|
69
|
-
_useState2 = _slicedToArray(_useState, 2),
|
|
70
|
-
messages = _useState2[0],
|
|
71
|
-
setMessageList = _useState2[1];
|
|
72
|
-
var _useState3 = useState(true),
|
|
123
|
+
var _useState3 = useState([]),
|
|
73
124
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
74
|
-
|
|
75
|
-
|
|
125
|
+
messages = _useState4[0],
|
|
126
|
+
setMessageList = _useState4[1];
|
|
127
|
+
var _useState5 = useState(true),
|
|
128
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
129
|
+
messagesLoading = _useState6[0],
|
|
130
|
+
setMessagesLoading = _useState6[1];
|
|
76
131
|
|
|
77
132
|
// 工具展示List
|
|
78
|
-
var
|
|
79
|
-
_useState6 = _slicedToArray(_useState5, 2),
|
|
80
|
-
toolShowList = _useState6[0],
|
|
81
|
-
setToolShowList = _useState6[1];
|
|
82
|
-
var _useState7 = useState(false),
|
|
133
|
+
var _useState7 = useState([]),
|
|
83
134
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
// 分享模式相关状态
|
|
135
|
+
toolShowList = _useState8[0],
|
|
136
|
+
setToolShowList = _useState8[1];
|
|
88
137
|
var _useState9 = useState(false),
|
|
89
138
|
_useState10 = _slicedToArray(_useState9, 2),
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
139
|
+
showAddTag = _useState10[0],
|
|
140
|
+
setShowAddTag = _useState10[1];
|
|
141
|
+
|
|
142
|
+
// 分享模式相关状态
|
|
143
|
+
var _useState11 = useState(false),
|
|
93
144
|
_useState12 = _slicedToArray(_useState11, 2),
|
|
94
|
-
|
|
95
|
-
|
|
145
|
+
shareMode = _useState12[0],
|
|
146
|
+
setShareMode = _useState12[1];
|
|
147
|
+
var _useState13 = useState([]),
|
|
148
|
+
_useState14 = _slicedToArray(_useState13, 2),
|
|
149
|
+
selectedMessages = _useState14[0],
|
|
150
|
+
setSelectedMessages = _useState14[1];
|
|
96
151
|
|
|
97
152
|
// WebSocket 连接状态
|
|
98
|
-
var
|
|
99
|
-
|
|
100
|
-
wsConnectionStatus =
|
|
101
|
-
setWsConnectionStatus =
|
|
153
|
+
var _useState15 = useState(null),
|
|
154
|
+
_useState16 = _slicedToArray(_useState15, 2),
|
|
155
|
+
wsConnectionStatus = _useState16[0],
|
|
156
|
+
setWsConnectionStatus = _useState16[1];
|
|
102
157
|
var chatAppRef = useRef(null);
|
|
103
158
|
var chatInputRef = useRef(null);
|
|
104
159
|
var messageListRef = useRef([]);
|
|
@@ -108,22 +163,27 @@ var AssistantChatProvider = function AssistantChatProvider() {
|
|
|
108
163
|
var textAreaRef = useRef(null);
|
|
109
164
|
// 请求版本号,用于忽略过时的 API 响应
|
|
110
165
|
var requestVersionRef = useRef(0);
|
|
166
|
+
|
|
167
|
+
// 存储最新的 getMessageList 函数引用,避免闭包陷阱
|
|
168
|
+
var getMessageListRef = useRef();
|
|
169
|
+
// 防抖定时器 ref
|
|
170
|
+
var getMessageListDebounceRef = useRef();
|
|
111
171
|
var inputFormRef = useRef(null);
|
|
112
|
-
var
|
|
113
|
-
|
|
114
|
-
inputFormSchema =
|
|
115
|
-
setInputFormSchema =
|
|
172
|
+
var _useState17 = useState(null),
|
|
173
|
+
_useState18 = _slicedToArray(_useState17, 2),
|
|
174
|
+
inputFormSchema = _useState18[0],
|
|
175
|
+
setInputFormSchema = _useState18[1];
|
|
116
176
|
// 当前消息id
|
|
117
177
|
var currentUpdateMessageIdRef = useRef(null);
|
|
118
178
|
// 当前消息id index
|
|
119
179
|
var currentUpdateMessageIndexRef = useRef(-1);
|
|
120
|
-
var
|
|
180
|
+
var _useState19 = useState({
|
|
121
181
|
thinkingMode: FEATURE_MODE_TYPE_KEY.AUTO,
|
|
122
182
|
webSearchMode: FEATURE_MODE_TYPE_KEY.AUTO
|
|
123
183
|
}),
|
|
124
|
-
|
|
125
|
-
featureConfig =
|
|
126
|
-
setFeatureConfig =
|
|
184
|
+
_useState20 = _slicedToArray(_useState19, 2),
|
|
185
|
+
featureConfig = _useState20[0],
|
|
186
|
+
setFeatureConfig = _useState20[1];
|
|
127
187
|
useEffect(function () {
|
|
128
188
|
if (hasDefaultDataSource) {
|
|
129
189
|
var _chatAppRef$current;
|
|
@@ -140,6 +200,68 @@ var AssistantChatProvider = function AssistantChatProvider() {
|
|
|
140
200
|
}
|
|
141
201
|
}, [dataSource, hasDefaultDataSource]);
|
|
142
202
|
|
|
203
|
+
// ======================================= 开箱即用:自动获取会话连接 =======================================
|
|
204
|
+
/**
|
|
205
|
+
* 自动获取会话连接逻辑
|
|
206
|
+
* 当 autoConnect 为 true 且没有传入 bizId 时,自动调用 API 获取会话连接
|
|
207
|
+
* 只在 CHAT 场景下生效
|
|
208
|
+
*
|
|
209
|
+
* 优先级:propBizId > URL参数中的subjectId > props中的subjectId > 自动创建新会话
|
|
210
|
+
*/
|
|
211
|
+
useEffect(function () {
|
|
212
|
+
// 只有在 CHAT 模式下才启用自动连接
|
|
213
|
+
var isChatMode = mode === ChatTypeEnum.Chat || bizDomain === 'CHAT';
|
|
214
|
+
// 检查是否需要自动连接:启用自动连接 && 没有外部传入的 bizId && 是 CHAT 模式 && 不在连接中
|
|
215
|
+
var shouldAutoConnect = autoConnect && !propBizId && isChatMode && !isConnectingRef.current;
|
|
216
|
+
if (shouldAutoConnect) {
|
|
217
|
+
isConnectingRef.current = true;
|
|
218
|
+
|
|
219
|
+
// 优先从 URL 读取 subjectId,其次使用 props 中的 subjectId
|
|
220
|
+
var urlSubjectId = getSubjectIdFromUrl();
|
|
221
|
+
var effectiveSubjectId = urlSubjectId || subjectId;
|
|
222
|
+
getConversationConnection({
|
|
223
|
+
bizDomain: 'CHAT',
|
|
224
|
+
subjectId: effectiveSubjectId
|
|
225
|
+
}).then(function (res) {
|
|
226
|
+
if ((res === null || res === void 0 ? void 0 : res.code) === REQUEST_SUCCESS_CODE) {
|
|
227
|
+
var connectionInfo = res.data;
|
|
228
|
+
// 更新内部 bizId
|
|
229
|
+
setInternalBizId(connectionInfo.subjectId);
|
|
230
|
+
// 将 subjectId 持久化到 URL
|
|
231
|
+
updateUrlWithSubjectId(connectionInfo.subjectId);
|
|
232
|
+
// 触发回调
|
|
233
|
+
onConnectionReady === null || onConnectionReady === void 0 || onConnectionReady(connectionInfo);
|
|
234
|
+
} else {
|
|
235
|
+
console.warn('自动获取会话连接失败:', res === null || res === void 0 ? void 0 : res.message);
|
|
236
|
+
}
|
|
237
|
+
}).catch(function (error) {
|
|
238
|
+
console.error('自动获取会话连接出错:', error);
|
|
239
|
+
}).finally(function () {
|
|
240
|
+
isConnectingRef.current = false;
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}, [autoConnect, propBizId, subjectId, mode, bizDomain]);
|
|
244
|
+
|
|
245
|
+
// 当 propBizId 变化时,同步更新内部状态
|
|
246
|
+
useEffect(function () {
|
|
247
|
+
if (propBizId) {
|
|
248
|
+
setInternalBizId(propBizId);
|
|
249
|
+
}
|
|
250
|
+
}, [propBizId]);
|
|
251
|
+
|
|
252
|
+
// ======================================= 内置 onSend 逻辑 =======================================
|
|
253
|
+
/**
|
|
254
|
+
* 使用 useAutoSend Hook 获取有效的 onSend 方法
|
|
255
|
+
* 如果用户传入了 onSend,使用用户的;否则使用内置逻辑
|
|
256
|
+
*/
|
|
257
|
+
var effectiveOnSend = useAutoSend({
|
|
258
|
+
bizId: bizId,
|
|
259
|
+
bizDomain: bizDomain,
|
|
260
|
+
onSend: onSend,
|
|
261
|
+
onSendSuccess: onSendSuccess,
|
|
262
|
+
onSendError: onSendError
|
|
263
|
+
});
|
|
264
|
+
|
|
143
265
|
// ======================================= log埋点 =======================================
|
|
144
266
|
/**
|
|
145
267
|
* 辅助交互通用监控日志上报
|
|
@@ -169,27 +291,38 @@ var AssistantChatProvider = function AssistantChatProvider() {
|
|
|
169
291
|
};
|
|
170
292
|
|
|
171
293
|
// ======================================= 消息更新 =======================================
|
|
172
|
-
//
|
|
294
|
+
// 拉取消息列表(带防抖机制)
|
|
173
295
|
var getMessageList = function getMessageList() {
|
|
174
|
-
var _chatInputRef$current;
|
|
175
296
|
var isInit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
176
297
|
var scroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
298
|
+
// 清除之前的定时器,实现防抖
|
|
299
|
+
if (getMessageListDebounceRef.current) {
|
|
300
|
+
clearTimeout(getMessageListDebounceRef.current);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// 使用 50ms 防抖,防止短时间内多次调用产生多个请求
|
|
304
|
+
getMessageListDebounceRef.current = setTimeout(function () {
|
|
305
|
+
var _chatInputRef$current;
|
|
306
|
+
updateMessageList({
|
|
307
|
+
bizId: bizId,
|
|
308
|
+
bizDomain: bizDomain,
|
|
309
|
+
messagesMaxLength: messagesMaxLength,
|
|
310
|
+
setMessagesLoading: setMessagesLoading,
|
|
311
|
+
currentUpdateMessageIdRef: currentUpdateMessageIdRef,
|
|
312
|
+
messageListRef: messageListRef,
|
|
313
|
+
setMessageList: setMessageList,
|
|
314
|
+
chatAppRef: chatAppRef,
|
|
315
|
+
currentUpdateMessageIndexRef: currentUpdateMessageIndexRef,
|
|
316
|
+
isInit: isInit,
|
|
317
|
+
scroll: scroll,
|
|
318
|
+
setSendMessageDisabled: chatInputRef === null || chatInputRef === void 0 || (_chatInputRef$current = chatInputRef.current) === null || _chatInputRef$current === void 0 ? void 0 : _chatInputRef$current.setSendMessageDisabled,
|
|
319
|
+
requestVersionRef: requestVersionRef
|
|
320
|
+
});
|
|
321
|
+
}, 50);
|
|
192
322
|
};
|
|
323
|
+
|
|
324
|
+
// 更新 ref 为最新的 getMessageList 函数
|
|
325
|
+
getMessageListRef.current = getMessageList;
|
|
193
326
|
var initMessageList = function initMessageList() {
|
|
194
327
|
getMessageList === null || getMessageList === void 0 || getMessageList(true);
|
|
195
328
|
};
|
|
@@ -237,6 +370,19 @@ var AssistantChatProvider = function AssistantChatProvider() {
|
|
|
237
370
|
if (imConnectCallback && typeof imConnectCallback === 'function') {
|
|
238
371
|
imConnectCallback();
|
|
239
372
|
}
|
|
373
|
+
// 开箱即用:自动发送消息
|
|
374
|
+
if (autoSendMessage && !autoSendDoneRef.current) {
|
|
375
|
+
autoSendDoneRef.current = true;
|
|
376
|
+
// 延迟一下,确保消息列表已加载
|
|
377
|
+
setTimeout(function () {
|
|
378
|
+
effectiveOnSend === null || effectiveOnSend === void 0 || effectiveOnSend({
|
|
379
|
+
params: {
|
|
380
|
+
query: autoSendMessage
|
|
381
|
+
},
|
|
382
|
+
featureConfig: featureConfig
|
|
383
|
+
}, function () {});
|
|
384
|
+
}, 100);
|
|
385
|
+
}
|
|
240
386
|
},
|
|
241
387
|
log: log,
|
|
242
388
|
// 连接状态变化回调
|
|
@@ -294,12 +440,12 @@ var AssistantChatProvider = function AssistantChatProvider() {
|
|
|
294
440
|
};
|
|
295
441
|
}, [bizId]);
|
|
296
442
|
useEffect(function () {
|
|
297
|
-
// 监听全部list
|
|
298
|
-
var listenerGetMessageList = function listenerGetMessageList(
|
|
299
|
-
var _logTrace$closeTrace;
|
|
443
|
+
// 监听全部list - 使用 ref 调用最新的 getMessageList 函数,避免闭包陷阱
|
|
444
|
+
var listenerGetMessageList = function listenerGetMessageList() {
|
|
445
|
+
var _logTrace$closeTrace, _getMessageListRef$cu;
|
|
300
446
|
logTrace === null || logTrace === void 0 || (_logTrace$closeTrace = logTrace.closeTrace) === null || _logTrace$closeTrace === void 0 || _logTrace$closeTrace.call(logTrace, LOG_TRACE_TYPE_ENUMS.LLM_GET_MESSAGE_LIET_APUSH, window.currentMessageSendTimestamp);
|
|
301
447
|
window.currentMessageSendTimestamp = undefined;
|
|
302
|
-
|
|
448
|
+
(_getMessageListRef$cu = getMessageListRef.current) === null || _getMessageListRef$cu === void 0 || _getMessageListRef$cu.call(getMessageListRef);
|
|
303
449
|
};
|
|
304
450
|
// 监听单条数据
|
|
305
451
|
var listenerGetSingleMessage = function listenerGetSingleMessage(argJson) {
|
|
@@ -343,22 +489,26 @@ var AssistantChatProvider = function AssistantChatProvider() {
|
|
|
343
489
|
chatInputRef === null || chatInputRef === void 0 || (_chatInputRef$current9 = chatInputRef.current) === null || _chatInputRef$current9 === void 0 || (_chatInputRef$current10 = _chatInputRef$current9.setSendMessageDisabled) === null || _chatInputRef$current10 === void 0 || _chatInputRef$current10.call(_chatInputRef$current9, false);
|
|
344
490
|
}
|
|
345
491
|
};
|
|
346
|
-
|
|
347
|
-
|
|
492
|
+
|
|
493
|
+
// 保存当前 hasDefaultDataSource 值用于 cleanup,确保清理时使用相同的条件
|
|
494
|
+
var shouldListen = !hasDefaultDataSource;
|
|
495
|
+
if (shouldListen) {
|
|
496
|
+
// 消息非受控,监听消息列表刷新
|
|
348
497
|
event.on(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_GET_MESSAGE_LIST, listenerGetMessageList);
|
|
349
498
|
event.on(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_GET_MESSAGE, listenerGetSingleMessage);
|
|
350
499
|
}
|
|
351
500
|
event.on(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_LLM_STREAM_MESSAGE, updateStreamMessage);
|
|
352
501
|
event.on(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_LLM_TRACE_MESSAGE, updateTraceMessage);
|
|
353
502
|
return function () {
|
|
354
|
-
if (
|
|
503
|
+
if (shouldListen) {
|
|
355
504
|
event.off(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_GET_MESSAGE_LIST, listenerGetMessageList);
|
|
356
505
|
event.off(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_GET_MESSAGE, listenerGetSingleMessage);
|
|
357
506
|
}
|
|
358
507
|
event.off(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_LLM_STREAM_MESSAGE, updateStreamMessage);
|
|
359
508
|
event.off(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_LLM_TRACE_MESSAGE, updateTraceMessage);
|
|
360
509
|
};
|
|
361
|
-
}, [bizId]);
|
|
510
|
+
}, [bizId, hasDefaultDataSource]); // 添加 hasDefaultDataSource 依赖,确保条件变化时正确清理和重新注册 listener
|
|
511
|
+
|
|
362
512
|
useEffect(function () {
|
|
363
513
|
var updateInputValue = function updateInputValue(_value) {
|
|
364
514
|
var _chatInputRef$current11, _chatInputRef$current12;
|
|
@@ -395,7 +545,7 @@ var AssistantChatProvider = function AssistantChatProvider() {
|
|
|
395
545
|
chatType: chatType
|
|
396
546
|
}, otherSendProps);
|
|
397
547
|
sendMessageRequest({
|
|
398
|
-
onSend:
|
|
548
|
+
onSend: effectiveOnSend,
|
|
399
549
|
sendInfoQuery: sendInfoQuery,
|
|
400
550
|
onSuccessCallback: onSuccessCallback
|
|
401
551
|
// setSendMessageDisabled: chatInputRef?.current?.setSendMessageDisabled,
|
|
@@ -720,9 +870,12 @@ var AssistantChatProvider = function AssistantChatProvider() {
|
|
|
720
870
|
placeholder: placeholder,
|
|
721
871
|
messageCardWidth: messageCardWidth,
|
|
722
872
|
enableWsConnectCallback: enableWsConnectCallback,
|
|
723
|
-
|
|
724
|
-
|
|
873
|
+
// 使用有效的 onSend(可能是用户传入的,也可能是内置的)
|
|
874
|
+
onSend: effectiveOnSend,
|
|
875
|
+
assistantChat: propAssistantChat,
|
|
725
876
|
isAssistant: isAssistant,
|
|
877
|
+
// WebSocket 连接状态
|
|
878
|
+
wsConnectionStatus: wsConnectionStatus,
|
|
726
879
|
textAreaRef: textAreaRef,
|
|
727
880
|
messages: messages,
|
|
728
881
|
setMessageList: setMessageList,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useAutoSend } from "./useAutoSend";
|