@ai-group/chat-sdk 3.2.1 → 3.3.0
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 +89 -60
- package/dist/cjs/components/XAdkChatbot/components/FunctionCallRender/index.d.ts +1 -6
- package/dist/cjs/components/XAdkChatbot/components/FunctionCallRender/index.js +19 -3
- package/dist/cjs/components/XAdkChatbot/components/FunctionCallRender/index.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/index.js +36 -8
- package/dist/cjs/components/XAdkChatbot/index.js.map +3 -3
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.d.ts +5 -0
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +9 -4
- package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/compound/Messages.d.ts +7 -0
- package/dist/cjs/components/XAdkProvider/compound/Messages.js +10 -4
- package/dist/cjs/components/XAdkProvider/compound/Messages.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/context/ChatStateContext.d.ts +3 -1
- package/dist/cjs/components/XAdkProvider/context/ChatStateContext.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/index.js +27 -3
- package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
- package/dist/cjs/components/XAdkSender/index.js +18 -13
- package/dist/cjs/components/XAdkSender/index.js.map +2 -2
- package/dist/cjs/components/XAdkThoughtChain/index.js +29 -8
- package/dist/cjs/components/XAdkThoughtChain/index.js.map +3 -3
- package/dist/cjs/hooks/useADKChat.d.ts +1 -1
- package/dist/cjs/hooks/useADKChat.js +3 -1
- package/dist/cjs/hooks/useADKChat.js.map +2 -2
- package/dist/cjs/index.d.ts +3 -2
- package/dist/cjs/index.js +20 -1
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/presets/xGroupAdk.d.ts +20 -0
- package/dist/cjs/presets/xGroupAdk.js +130 -0
- package/dist/cjs/presets/xGroupAdk.js.map +7 -0
- package/dist/cjs/types/ChatStrategies.d.ts +45 -0
- package/dist/cjs/types/ChatStrategies.js +18 -0
- package/dist/cjs/types/ChatStrategies.js.map +7 -0
- package/dist/cjs/types/FunctionCallRender.d.ts +35 -0
- package/dist/cjs/types/FunctionCallRender.js +32 -0
- package/dist/cjs/types/FunctionCallRender.js.map +7 -0
- package/dist/cjs/types/XAdkChatbot.d.ts +32 -0
- package/dist/cjs/types/XAdkChatbot.js.map +1 -1
- package/dist/cjs/types/XAdkProvider.d.ts +19 -0
- package/dist/cjs/types/XAdkProvider.js.map +2 -2
- package/dist/cjs/types/XAdkSender.d.ts +20 -4
- package/dist/cjs/types/XAdkSender.js.map +1 -1
- package/dist/cjs/types/XAdkThoughtChain.d.ts +10 -2
- package/dist/cjs/types/XAdkThoughtChain.js.map +1 -1
- package/dist/cjs/types/XAiChatbot.d.ts +1 -1
- package/dist/cjs/types/XAiChatbot.js.map +1 -1
- package/dist/cjs/types/XAiProvider.d.ts +1 -1
- package/dist/cjs/types/XAiProvider.js.map +1 -1
- package/dist/cjs/types/index.d.ts +2 -0
- package/dist/cjs/types/index.js +5 -1
- package/dist/cjs/types/index.js.map +2 -2
- package/dist/cjs/utils/providerManager.d.ts +1 -1
- package/dist/cjs/utils/providerManager.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/index.d.ts +1 -6
- package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/index.js +25 -5
- package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/index.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/index.js +35 -8
- package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.d.ts +5 -0
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +9 -4
- package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/Messages.d.ts +7 -0
- package/dist/esm/components/XAdkProvider/compound/Messages.js +14 -9
- package/dist/esm/components/XAdkProvider/compound/Messages.js.map +1 -1
- package/dist/esm/components/XAdkProvider/context/ChatStateContext.d.ts +3 -1
- package/dist/esm/components/XAdkProvider/context/ChatStateContext.js.map +1 -1
- package/dist/esm/components/XAdkProvider/index.js +21 -4
- package/dist/esm/components/XAdkProvider/index.js.map +1 -1
- package/dist/esm/components/XAdkSender/index.js +25 -17
- package/dist/esm/components/XAdkSender/index.js.map +1 -1
- package/dist/esm/components/XAdkThoughtChain/index.js +23 -7
- package/dist/esm/components/XAdkThoughtChain/index.js.map +1 -1
- package/dist/esm/hooks/useADKChat.d.ts +1 -1
- package/dist/esm/hooks/useADKChat.js +3 -1
- package/dist/esm/hooks/useADKChat.js.map +1 -1
- package/dist/esm/index.d.ts +3 -2
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/presets/xGroupAdk.d.ts +20 -0
- package/dist/esm/presets/xGroupAdk.js +122 -0
- package/dist/esm/presets/xGroupAdk.js.map +1 -0
- package/dist/esm/types/ChatStrategies.d.ts +45 -0
- package/dist/esm/types/ChatStrategies.js +2 -0
- package/dist/esm/types/ChatStrategies.js.map +1 -0
- package/dist/esm/types/FunctionCallRender.d.ts +35 -0
- package/dist/esm/types/FunctionCallRender.js +14 -0
- package/dist/esm/types/FunctionCallRender.js.map +1 -0
- package/dist/esm/types/XAdkChatbot.d.ts +32 -0
- package/dist/esm/types/XAdkChatbot.js.map +1 -1
- package/dist/esm/types/XAdkProvider.d.ts +19 -0
- package/dist/esm/types/XAdkProvider.js.map +1 -1
- package/dist/esm/types/XAdkSender.d.ts +20 -4
- package/dist/esm/types/XAdkSender.js.map +1 -1
- package/dist/esm/types/XAdkThoughtChain.d.ts +10 -2
- package/dist/esm/types/XAdkThoughtChain.js.map +1 -1
- package/dist/esm/types/XAiChatbot.d.ts +1 -1
- package/dist/esm/types/XAiChatbot.js.map +1 -1
- package/dist/esm/types/XAiProvider.d.ts +1 -1
- package/dist/esm/types/XAiProvider.js.map +1 -1
- package/dist/esm/types/index.d.ts +2 -0
- package/dist/esm/types/index.js +2 -0
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/utils/providerManager.d.ts +1 -1
- package/dist/esm/utils/providerManager.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
## 安装
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install @
|
|
8
|
+
npm install @ai-group/chat-sdk
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
## 使用方法
|
|
@@ -13,25 +13,25 @@ npm install @x-group/chat-sdk
|
|
|
13
13
|
### 方式一:推荐写法(Coze 风格)
|
|
14
14
|
|
|
15
15
|
```javascript
|
|
16
|
-
import XAiWebSDK from
|
|
16
|
+
import XAiWebSDK from "@ai-group/chat-sdk";
|
|
17
17
|
|
|
18
18
|
// 创建 SDK 实例 - 类似 Coze 的写法
|
|
19
19
|
const chatbot = new XAiWebSDK.initChatbot({
|
|
20
|
-
url:
|
|
21
|
-
token:
|
|
20
|
+
url: "https://your-api-server.com",
|
|
21
|
+
token: "your-token",
|
|
22
22
|
config: {
|
|
23
|
-
appNo:
|
|
23
|
+
appNo: "your-app-no",
|
|
24
24
|
},
|
|
25
25
|
componentProps: {
|
|
26
|
-
id:
|
|
27
|
-
width:
|
|
28
|
-
height:
|
|
26
|
+
id: "chatbot-container",
|
|
27
|
+
width: "400px",
|
|
28
|
+
height: "600px",
|
|
29
29
|
},
|
|
30
30
|
onError: (error) => {
|
|
31
|
-
console.error(
|
|
31
|
+
console.error("Chatbot init error:", error);
|
|
32
32
|
},
|
|
33
33
|
onSuccess: (appInfo) => {
|
|
34
|
-
console.log(
|
|
34
|
+
console.log("Chatbot init success:", appInfo);
|
|
35
35
|
},
|
|
36
36
|
});
|
|
37
37
|
|
|
@@ -44,19 +44,19 @@ chatbot.unmount();
|
|
|
44
44
|
```javascript
|
|
45
45
|
// 使用静态方法(不推荐,但保持兼容)
|
|
46
46
|
const chatbot = XAiWebSDK.create({
|
|
47
|
-
url:
|
|
48
|
-
token:
|
|
47
|
+
url: "https://your-api-server.com",
|
|
48
|
+
token: "your-token",
|
|
49
49
|
config: {
|
|
50
|
-
appNo:
|
|
50
|
+
appNo: "your-app-no",
|
|
51
51
|
},
|
|
52
52
|
componentProps: {
|
|
53
|
-
id:
|
|
53
|
+
id: "chatbot-container",
|
|
54
54
|
},
|
|
55
55
|
onError: (error) => {
|
|
56
|
-
console.error(
|
|
56
|
+
console.error("Chatbot init error:", error);
|
|
57
57
|
},
|
|
58
58
|
onSuccess: (appInfo) => {
|
|
59
|
-
console.log(
|
|
59
|
+
console.log("Chatbot init success:", appInfo);
|
|
60
60
|
},
|
|
61
61
|
});
|
|
62
62
|
```
|
|
@@ -64,18 +64,18 @@ const chatbot = XAiWebSDK.create({
|
|
|
64
64
|
### 方式三:直接指定容器
|
|
65
65
|
|
|
66
66
|
```javascript
|
|
67
|
-
const container = document.getElementById(
|
|
67
|
+
const container = document.getElementById("my-chatbot");
|
|
68
68
|
const chatbot = new XAiWebSDK(container, {
|
|
69
|
-
url:
|
|
70
|
-
token:
|
|
69
|
+
url: "https://your-api-server.com",
|
|
70
|
+
token: "your-token",
|
|
71
71
|
config: {
|
|
72
|
-
appNo:
|
|
72
|
+
appNo: "your-app-no",
|
|
73
73
|
},
|
|
74
74
|
onError: (error) => {
|
|
75
|
-
console.error(
|
|
75
|
+
console.error("Chatbot init error:", error);
|
|
76
76
|
},
|
|
77
77
|
onSuccess: (appInfo) => {
|
|
78
|
-
console.log(
|
|
78
|
+
console.log("Chatbot init success:", appInfo);
|
|
79
79
|
},
|
|
80
80
|
});
|
|
81
81
|
```
|
|
@@ -84,37 +84,66 @@ const chatbot = new XAiWebSDK(container, {
|
|
|
84
84
|
|
|
85
85
|
### XAiSDKProps
|
|
86
86
|
|
|
87
|
-
| 参数
|
|
88
|
-
|
|
89
|
-
| url
|
|
90
|
-
| token
|
|
91
|
-
| config
|
|
92
|
-
| componentProps | object
|
|
93
|
-
| onError
|
|
94
|
-
| onSuccess
|
|
87
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
88
|
+
| -------------- | -------- | ---- | --------------------------------- |
|
|
89
|
+
| url | string | 是 | AI 服务地址 |
|
|
90
|
+
| token | string | 是 | 认证 token |
|
|
91
|
+
| config | object | 是 | 配置信息,包含 appNo 等 |
|
|
92
|
+
| componentProps | object | 否 | 容器属性,支持 id 和任意 CSS 样式 |
|
|
93
|
+
| onError | function | 否 | 错误回调函数 |
|
|
94
|
+
| onSuccess | function | 否 | 成功回调函数 |
|
|
95
95
|
|
|
96
96
|
### config 配置项
|
|
97
97
|
|
|
98
|
-
| 参数
|
|
99
|
-
|
|
100
|
-
| appNo
|
|
101
|
-
| allowUpload
|
|
102
|
-
| session.showSessionList | boolean
|
|
103
|
-
| showFeedback
|
|
104
|
-
| onFileClick
|
|
105
|
-
| uploadRequest
|
|
98
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
99
|
+
| ----------------------- | -------- | ---- | -------------------------------- |
|
|
100
|
+
| appNo | string | 是 | 应用编号 |
|
|
101
|
+
| allowUpload | boolean | 否 | 是否允许上传文件,默认 false |
|
|
102
|
+
| session.showSessionList | boolean | 否 | 是否显示会话列表,默认 false |
|
|
103
|
+
| showFeedback | boolean | 否 | 是否显示点赞/点踩按钮,默认 true |
|
|
104
|
+
| onFileClick | function | 否 | 点击附件卡片的回调函数 |
|
|
105
|
+
| uploadRequest | function | 否 | 自定义文件上传函数;不传时 xgroup-adk 预设使用默认上传接口 |
|
|
106
|
+
|
|
107
|
+
### Preset / Strategies
|
|
108
|
+
|
|
109
|
+
`XAdkProvider` 和 UMD 入口默认启用 `xgroup-adk` preset,用于保留众安信科 ADK 协议体验:确认工具、任务转交、注释模式思维链、默认确认响应和默认附件上传都会自动生效。
|
|
110
|
+
|
|
111
|
+
如果需要接入其他协议或覆盖局部行为,可以使用 `preset` / `strategies`:
|
|
112
|
+
|
|
113
|
+
```tsx
|
|
114
|
+
<XAdkProvider preset="base" chatData={customChatData}>
|
|
115
|
+
<XAdkProvider.DefaultLayout />
|
|
116
|
+
</XAdkProvider>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
<XAdkProvider
|
|
121
|
+
token="your-token"
|
|
122
|
+
config={{ appNo: "your-app-no" }}
|
|
123
|
+
strategies={{
|
|
124
|
+
resolveToolKind: ({ name }) =>
|
|
125
|
+
name === "my_approval_tool" ? "approval" : "default",
|
|
126
|
+
}}
|
|
127
|
+
>
|
|
128
|
+
<XAdkProvider.DefaultLayout />
|
|
129
|
+
</XAdkProvider>
|
|
130
|
+
```
|
|
106
131
|
|
|
107
132
|
### 回调函数
|
|
108
133
|
|
|
109
134
|
#### onError(error)
|
|
135
|
+
|
|
110
136
|
- `error.code`: 错误代码
|
|
111
137
|
- `error.message`: 错误信息
|
|
112
138
|
|
|
113
139
|
#### onSuccess(appInfo)
|
|
140
|
+
|
|
114
141
|
- `appInfo`: 应用信息对象,包含应用配置等
|
|
115
142
|
|
|
116
143
|
#### onFileClick(file)
|
|
144
|
+
|
|
117
145
|
点击对话中的附件卡片时触发(非图片、非音视频文件)。
|
|
146
|
+
|
|
118
147
|
- `file`: 文件信息对象
|
|
119
148
|
- `fileName`: 文件名
|
|
120
149
|
- `fileId`: 文件ID
|
|
@@ -123,39 +152,39 @@ const chatbot = new XAiWebSDK(container, {
|
|
|
123
152
|
- `fileSize`: 文件大小
|
|
124
153
|
|
|
125
154
|
#### uploadRequest(options)
|
|
126
|
-
|
|
155
|
+
|
|
156
|
+
自定义文件上传函数,用于覆盖 xgroup-adk 预设的默认上传行为。普通众安信科 ADK 接入只需要配置 `allowUpload: true`,无需手写 `uploadRequest`。
|
|
157
|
+
|
|
127
158
|
- `options.file`: 要上传的 File 对象
|
|
128
159
|
- `options.onProgress`: 进度回调,参数 `{ percent: number }`
|
|
129
|
-
- `options.onSuccess`:
|
|
160
|
+
- `options.onSuccess`: 上传成功回调,推荐参数为扁平文件信息;也兼容 `{ data: 文件信息 }`
|
|
130
161
|
- `options.onError`: 上传失败回调,参数为 Error 对象
|
|
131
162
|
|
|
132
163
|
**示例:**
|
|
133
164
|
|
|
134
165
|
```javascript
|
|
135
166
|
const chatbot = new XAiWebSDK.initChatbot({
|
|
136
|
-
token:
|
|
167
|
+
token: "your-token",
|
|
137
168
|
config: {
|
|
138
|
-
appNo:
|
|
169
|
+
appNo: "your-app-no",
|
|
139
170
|
allowUpload: true,
|
|
140
171
|
// 自定义上传
|
|
141
172
|
uploadRequest: async ({ file, onProgress, onSuccess, onError }) => {
|
|
142
173
|
try {
|
|
143
174
|
const formData = new FormData();
|
|
144
|
-
formData.append(
|
|
145
|
-
const response = await fetch(
|
|
146
|
-
method:
|
|
175
|
+
formData.append("file", file);
|
|
176
|
+
const response = await fetch("/api/upload", {
|
|
177
|
+
method: "POST",
|
|
147
178
|
body: formData,
|
|
148
179
|
});
|
|
149
180
|
const data = await response.json();
|
|
150
181
|
onSuccess({
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
mimeType: data.mimeType,
|
|
158
|
-
},
|
|
182
|
+
fileName: data.fileName,
|
|
183
|
+
fileId: data.fileId,
|
|
184
|
+
tempUrl: data.fileUrl,
|
|
185
|
+
fileType: data.fileType,
|
|
186
|
+
fileSize: data.fileSize,
|
|
187
|
+
mimeType: data.mimeType,
|
|
159
188
|
});
|
|
160
189
|
} catch (error) {
|
|
161
190
|
onError(error);
|
|
@@ -163,7 +192,7 @@ const chatbot = new XAiWebSDK.initChatbot({
|
|
|
163
192
|
},
|
|
164
193
|
// 文件预览回调
|
|
165
194
|
onFileClick: (file) => {
|
|
166
|
-
console.log(
|
|
195
|
+
console.log("点击文件:", file);
|
|
167
196
|
// 可以在此处触发文件预览弹窗
|
|
168
197
|
},
|
|
169
198
|
},
|
|
@@ -172,9 +201,9 @@ const chatbot = new XAiWebSDK.initChatbot({
|
|
|
172
201
|
|
|
173
202
|
## 错误代码
|
|
174
203
|
|
|
175
|
-
| 代码
|
|
176
|
-
|
|
177
|
-
| APP_NOT_ENABLE | 应用未启用
|
|
178
|
-
| APP_DELETED
|
|
179
|
-
| APP_NOT_FOUND
|
|
180
|
-
| API_ERROR
|
|
204
|
+
| 代码 | 说明 |
|
|
205
|
+
| -------------- | ------------ |
|
|
206
|
+
| APP_NOT_ENABLE | 应用未启用 |
|
|
207
|
+
| APP_DELETED | 应用已下架 |
|
|
208
|
+
| APP_NOT_FOUND | 应用未找到 |
|
|
209
|
+
| API_ERROR | API 调用错误 |
|
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import type {
|
|
3
|
-
export interface FunctionCallRenderProps {
|
|
4
|
-
msg: IMessage;
|
|
5
|
-
showDetail?: boolean;
|
|
6
|
-
onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;
|
|
7
|
-
}
|
|
2
|
+
import type { FunctionCallRenderProps } from "../../../../types";
|
|
8
3
|
declare const FunctionCallRender: React.FC<FunctionCallRenderProps>;
|
|
9
4
|
export default FunctionCallRender;
|
|
@@ -35,19 +35,30 @@ module.exports = __toCommonJS(FunctionCallRender_exports);
|
|
|
35
35
|
var import_antd = require("antd");
|
|
36
36
|
var import_icons = require("@ant-design/icons");
|
|
37
37
|
var import_styles = require("./styles");
|
|
38
|
+
var import_FunctionCallRender = require("../../../../types/FunctionCallRender");
|
|
38
39
|
var import_XAiJsonView = __toESM(require("../../../XAiJsonView"));
|
|
39
40
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
40
41
|
var FunctionCallRender = ({
|
|
41
42
|
msg,
|
|
42
43
|
showDetail,
|
|
43
|
-
onConfirm
|
|
44
|
+
onConfirm,
|
|
45
|
+
kind: kindProp,
|
|
46
|
+
toolKindResolver = import_FunctionCallRender.defaultToolKindResolver,
|
|
47
|
+
renderApproval,
|
|
48
|
+
renderHandoff
|
|
44
49
|
}) => {
|
|
45
50
|
var _a, _b, _c, _d, _e;
|
|
46
51
|
const styles = (0, import_styles.useStyles)();
|
|
47
52
|
const fnCall = msg.functionCall;
|
|
48
53
|
const fnRes = msg.functionResponse;
|
|
49
54
|
const name = (fnCall == null ? void 0 : fnCall.name) || (fnRes == null ? void 0 : fnRes.name);
|
|
50
|
-
|
|
55
|
+
const kind = kindProp ?? toolKindResolver(name);
|
|
56
|
+
if (kind === "approval") {
|
|
57
|
+
if (renderApproval) {
|
|
58
|
+
const custom = renderApproval(msg, onConfirm);
|
|
59
|
+
if (custom !== null && custom !== void 0)
|
|
60
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: custom });
|
|
61
|
+
}
|
|
51
62
|
if (fnRes) {
|
|
52
63
|
if (msg.role === "bot")
|
|
53
64
|
return null;
|
|
@@ -106,7 +117,12 @@ var FunctionCallRender = ({
|
|
|
106
117
|
msg.id
|
|
107
118
|
);
|
|
108
119
|
}
|
|
109
|
-
if (
|
|
120
|
+
if (kind === "handoff") {
|
|
121
|
+
if (renderHandoff) {
|
|
122
|
+
const custom = renderHandoff(msg);
|
|
123
|
+
if (custom !== null && custom !== void 0)
|
|
124
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: custom });
|
|
125
|
+
}
|
|
110
126
|
const agentName = (_d = fnCall == null ? void 0 : fnCall.args) == null ? void 0 : _d.agentName;
|
|
111
127
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.wrapper, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.fnCall, children: [
|
|
112
128
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.UserSwitchOutlined, { style: { color: "#888" } }),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/components/XAdkChatbot/components/FunctionCallRender/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from \"react\";\nimport { Alert, Button, Flex, Form, Popover, Tooltip, Typography } from \"antd\";\nimport {\n CopyOutlined,\n ToolOutlined,\n CheckCircleTwoTone,\n LoadingOutlined,\n UserSwitchOutlined,\n InfoCircleOutlined,\n} from \"@ant-design/icons\";\nimport type {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAAwE;AACxE,mBAOO;AAEP,oBAA0B;AAC1B,yBAAqB;
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\nimport { Alert, Button, Flex, Form, Popover, Tooltip, Typography } from \"antd\";\nimport {\n CopyOutlined,\n ToolOutlined,\n CheckCircleTwoTone,\n LoadingOutlined,\n UserSwitchOutlined,\n InfoCircleOutlined,\n} from \"@ant-design/icons\";\nimport type { FunctionCallRenderProps, FunctionCall } from \"@/types\";\nimport { useStyles } from \"./styles\";\nimport { defaultToolKindResolver } from \"@/types/FunctionCallRender\";\nimport JsonView from \"@/components/XAiJsonView\";\n\nconst FunctionCallRender: React.FC<FunctionCallRenderProps> = ({\n msg,\n showDetail,\n onConfirm,\n kind: kindProp,\n toolKindResolver = defaultToolKindResolver,\n renderApproval,\n renderHandoff,\n}) => {\n const styles = useStyles();\n const fnCall = msg.functionCall as FunctionCall;\n const fnRes = msg.functionResponse;\n const name = fnCall?.name || fnRes?.name;\n const kind = kindProp ?? toolKindResolver(name);\n\n if (kind === \"approval\") {\n if (renderApproval) {\n const custom = renderApproval(msg, onConfirm);\n if (custom !== null && custom !== undefined) return <>{custom}</>;\n }\n if (fnRes) {\n if (msg.role === \"bot\") return null;\n const confirmed = fnRes.response?.confirmed;\n return (\n <div key={msg.id} className={styles.wrapper}>\n {confirmed ? (\n <Alert\n message=\"已确认\"\n type=\"success\"\n showIcon\n className={styles.alert}\n />\n ) : (\n <Alert\n message=\"已取消\"\n type=\"error\"\n showIcon\n className={styles.alert}\n />\n )}\n </div>\n );\n }\n const originalFn = msg?.functionCall?.args?.originalFunctionCall;\n return (\n <div\n key={msg.id}\n className={styles.wrapper}\n style={{ justifyContent: \"flex-end\" }}\n >\n <div className={styles.confirm}>\n <div className={styles.confirmText}>\n 请确认是否执行工具:{originalFn?.name}\n </div>\n <Flex justify=\"end\" gap={8}>\n <Button\n type=\"default\"\n size=\"small\"\n onClick={() => onConfirm?.(fnCall, false)}\n >\n 取消\n </Button>\n <Button\n type=\"primary\"\n size=\"small\"\n onClick={() => onConfirm?.(fnCall, true)}\n >\n 确认\n </Button>\n </Flex>\n </div>\n </div>\n );\n }\n if (kind === \"handoff\") {\n if (renderHandoff) {\n const custom = renderHandoff(msg);\n if (custom !== null && custom !== undefined) return <>{custom}</>;\n }\n const agentName = fnCall?.args?.agentName;\n return (\n <div key={msg.id} className={styles.wrapper}>\n <div className={styles.fnCall}>\n <UserSwitchOutlined style={{ color: \"#888\" }} />\n <Typography.Text\n ellipsis={{ tooltip: agentName }}\n style={{ maxWidth: 300, lineHeight: \"16px\" }}\n >\n 任务转交:{agentName}\n </Typography.Text>\n {msg.functionResponse ? (\n <CheckCircleTwoTone twoToneColor=\"#52c41a\" />\n ) : (\n <LoadingOutlined />\n )}\n </div>\n </div>\n );\n }\n const renderItem = (obj: any, text: string) => {\n const str = JSON.stringify(obj, null, 2);\n return (\n <Form.Item\n label={\n <Flex align=\"center\">\n <span className=\"mr-2\">{text}</span>\n <Typography.Text\n copyable={{\n text: str,\n icon: <CopyOutlined />,\n }}\n />\n </Flex>\n }\n style={{ marginBottom: 12 }}\n >\n <JsonView value={str} />\n </Form.Item>\n );\n };\n const renderResponse = () => {\n const res = msg.functionResponse;\n if (res) {\n if (res.response?.error) {\n return (\n <Tooltip title={res.response.error}>\n <InfoCircleOutlined style={{ color: \"#faad14\" }} />\n </Tooltip>\n );\n }\n return <CheckCircleTwoTone twoToneColor=\"#52c41a\" />;\n }\n return <LoadingOutlined />;\n };\n return (\n <div key={msg.id} className={styles.wrapper}>\n {showDetail ? (\n <Popover\n placement=\"left\"\n content={\n <Form style={{ width: 400 }} layout=\"vertical\">\n {renderItem(fnCall?.args, \"工具参数\")}\n {renderItem(msg.functionResponse?.response, \"工具响应\")}\n </Form>\n }\n >\n <div className={styles.fnCall}>\n <ToolOutlined style={{ color: \"#888\" }} />\n <Typography.Text\n ellipsis={{ tooltip: name }}\n style={{ maxWidth: 300, lineHeight: \"16px\" }}\n >\n 调用工具:{name}\n </Typography.Text>\n {renderResponse()}\n </div>\n </Popover>\n ) : (\n <div className={styles.fnCall}>\n <ToolOutlined style={{ color: \"#888\" }} />\n <Typography.Text\n ellipsis={{ tooltip: name }}\n style={{ maxWidth: 300, lineHeight: \"16px\" }}\n >\n 调用工具:{name}\n </Typography.Text>\n {renderResponse()}\n </div>\n )}\n </div>\n );\n};\n\nexport default FunctionCallRender;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["JsonView", "_a"]
|
|
7
7
|
}
|
|
@@ -43,6 +43,8 @@ var import_FunctionCallRender = __toESM(require("./components/FunctionCallRender
|
|
|
43
43
|
var import_FileGallery = __toESM(require("../FileGallery"));
|
|
44
44
|
var import_XAdkThoughtChain = __toESM(require("../XAdkThoughtChain"));
|
|
45
45
|
var import_utils = require("../../utils");
|
|
46
|
+
var import_xGroupAdk = require("../../presets/xGroupAdk");
|
|
47
|
+
var import_FunctionCallRender2 = require("../../types/FunctionCallRender");
|
|
46
48
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
47
49
|
var scrollThreshold = 10;
|
|
48
50
|
var XAdkChatbot = ({
|
|
@@ -67,7 +69,11 @@ var XAdkChatbot = ({
|
|
|
67
69
|
enableProcessParsing = true,
|
|
68
70
|
parseOptions,
|
|
69
71
|
initialized = false,
|
|
70
|
-
onFileClick
|
|
72
|
+
onFileClick,
|
|
73
|
+
renderFunctionCall,
|
|
74
|
+
toolKindResolver,
|
|
75
|
+
strategies,
|
|
76
|
+
preset
|
|
71
77
|
}) => {
|
|
72
78
|
const styles = (0, import_styles.useStyles)();
|
|
73
79
|
const listRef = (0, import_react.useRef)(null);
|
|
@@ -75,6 +81,18 @@ var XAdkChatbot = ({
|
|
|
75
81
|
const userHasScrolledRef = (0, import_react.useRef)(false);
|
|
76
82
|
const messagesEndRef = (0, import_react.useRef)(null);
|
|
77
83
|
const prevInitializedRef = (0, import_react.useRef)(false);
|
|
84
|
+
const mergedStrategies = (0, import_react.useMemo)(
|
|
85
|
+
() => (0, import_xGroupAdk.mergeChatStrategies)(preset, strategies),
|
|
86
|
+
[preset, strategies]
|
|
87
|
+
);
|
|
88
|
+
const resolveToolKind = (0, import_react.useCallback)(
|
|
89
|
+
(name, msg) => {
|
|
90
|
+
var _a;
|
|
91
|
+
return (toolKindResolver == null ? void 0 : toolKindResolver(name)) ?? ((_a = mergedStrategies.resolveToolKind) == null ? void 0 : _a.call(mergedStrategies, { name, msg })) ?? (0, import_FunctionCallRender2.defaultToolKindResolver)(name);
|
|
92
|
+
},
|
|
93
|
+
[toolKindResolver, mergedStrategies]
|
|
94
|
+
);
|
|
95
|
+
const parseProcessMessage = mergedStrategies.parseProcessMessage ?? import_utils.parseAgentMessage;
|
|
78
96
|
(0, import_react.useEffect)(() => {
|
|
79
97
|
if (!initialized)
|
|
80
98
|
return;
|
|
@@ -165,10 +183,11 @@ var XAdkChatbot = ({
|
|
|
165
183
|
return groups;
|
|
166
184
|
}, [messages, enableGrouping]);
|
|
167
185
|
const renderBotGroup = (0, import_react.useCallback)(
|
|
168
|
-
(group, isLastGroup) => {
|
|
186
|
+
(group, isLastGroup, renderFunctionCall2) => {
|
|
169
187
|
const { msgs, allFiles } = group;
|
|
170
188
|
if (!enableProcessParsing) {
|
|
171
189
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.botMsg, children: msgs.map((msg, i) => {
|
|
190
|
+
var _a;
|
|
172
191
|
if (msg.text) {
|
|
173
192
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
174
193
|
import_MarkdownRender.default,
|
|
@@ -180,12 +199,15 @@ var XAdkChatbot = ({
|
|
|
180
199
|
);
|
|
181
200
|
}
|
|
182
201
|
if (msg.functionCall) {
|
|
183
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
202
|
+
return (renderFunctionCall2 == null ? void 0 : renderFunctionCall2(msg)) ?? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
184
203
|
import_FunctionCallRender.default,
|
|
185
204
|
{
|
|
186
205
|
msg,
|
|
187
206
|
showDetail: showFnCallDetail,
|
|
188
|
-
onConfirm
|
|
207
|
+
onConfirm,
|
|
208
|
+
kind: resolveToolKind((_a = msg.functionCall) == null ? void 0 : _a.name, msg),
|
|
209
|
+
renderApproval: mergedStrategies.renderApproval,
|
|
210
|
+
renderHandoff: mergedStrategies.renderHandoff
|
|
189
211
|
},
|
|
190
212
|
`${msg.id}-${i}`
|
|
191
213
|
);
|
|
@@ -252,7 +274,7 @@ var XAdkChatbot = ({
|
|
|
252
274
|
}
|
|
253
275
|
}
|
|
254
276
|
} else if (msg.text && !msg.functionResponse) {
|
|
255
|
-
const parts = (
|
|
277
|
+
const parts = parseProcessMessage(msg.text, parseOptions);
|
|
256
278
|
parts.forEach((part, partIdx) => {
|
|
257
279
|
if ([
|
|
258
280
|
"planning",
|
|
@@ -308,7 +330,10 @@ var XAdkChatbot = ({
|
|
|
308
330
|
items: node.items,
|
|
309
331
|
showFnCallDetail,
|
|
310
332
|
onConfirm,
|
|
311
|
-
defaultOpen: isGroupLoading
|
|
333
|
+
defaultOpen: isGroupLoading,
|
|
334
|
+
renderFunctionCall: renderFunctionCall2,
|
|
335
|
+
toolKindResolver: (name) => resolveToolKind(name),
|
|
336
|
+
strategies: mergedStrategies
|
|
312
337
|
},
|
|
313
338
|
node.key
|
|
314
339
|
);
|
|
@@ -357,6 +382,7 @@ var XAdkChatbot = ({
|
|
|
357
382
|
[
|
|
358
383
|
enableProcessParsing,
|
|
359
384
|
parseOptions,
|
|
385
|
+
parseProcessMessage,
|
|
360
386
|
showFnCallDetail,
|
|
361
387
|
onConfirm,
|
|
362
388
|
loading,
|
|
@@ -368,7 +394,9 @@ var XAdkChatbot = ({
|
|
|
368
394
|
onShowLog,
|
|
369
395
|
actions,
|
|
370
396
|
onFileClick,
|
|
371
|
-
styles
|
|
397
|
+
styles,
|
|
398
|
+
resolveToolKind,
|
|
399
|
+
mergedStrategies
|
|
372
400
|
]
|
|
373
401
|
);
|
|
374
402
|
const renderUserGroup = (0, import_react.useCallback)(
|
|
@@ -418,7 +446,7 @@ var XAdkChatbot = ({
|
|
|
418
446
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_clsx.default)(styles.wrapper, className), style, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.list, ref: listRef, children: [
|
|
419
447
|
prologue && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.prologue, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_MarkdownRender.default, { text: prologue, onFileClick }) }),
|
|
420
448
|
chatGroups.map(
|
|
421
|
-
(group, idx) => group.role === "user" ? renderUserGroup(group) : renderBotGroup(group, idx === chatGroups.length - 1)
|
|
449
|
+
(group, idx) => group.role === "user" ? renderUserGroup(group) : renderBotGroup(group, idx === chatGroups.length - 1, renderFunctionCall)
|
|
422
450
|
),
|
|
423
451
|
renderSuggestions(),
|
|
424
452
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ref: messagesEndRef })
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/XAdkChatbot/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { Button, Flex, Tooltip, message as antdMessage } from \"antd\";\nimport clsx from \"clsx\";\nimport {\n SwapRightOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n CheckCircleFilled,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport { useStyles } from \"./styles\";\nimport MarkdownRender from \"./components/MarkdownRender\";\nimport FunctionCallRender from \"./components/FunctionCallRender\";\nimport FileGallery from \"../FileGallery\";\nimport XAdkThoughtChain from \"@/components/XAdkThoughtChain\";\nimport { parseAgentMessage } from \"@/utils\";\nimport type { IMessage, XAdkChatbotProps, ChatGroup } from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAdkThoughtChain\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot: React.FC<XAdkChatbotProps> = ({\n loading = false,\n prologue,\n suggestions,\n messages,\n showFnCallDetail,\n onConfirm,\n onSuggest,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n initialized = false,\n onFileClick,\n}) => {\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement>(null);\n const lastScrollTopRef = useRef(0);\n const userHasScrolledRef = useRef(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const prevInitializedRef = useRef(false);\n\n // 初始化完成时滚动到底部\n useEffect(() => {\n if (!initialized) return;\n if (!messages.length) return;\n if (prevInitializedRef.current) return; // 只在第一次 initialized+messages 就绪时触发\n prevInitializedRef.current = true;\n // 推迟到浏览器完成 paint 后执行,确保 DOM 高度已撑开\n const timer = setTimeout(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"auto\" });\n }, 0);\n return () => clearTimeout(timer);\n }, [initialized, messages]);\n\n // 流式输出时滚动到底部\n useEffect(() => {\n if (!loading) return;\n if (userHasScrolledRef.current) return;\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [loading, messages]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const currentTop = el.scrollTop;\n\n if (currentTop < lastScrollTopRef.current) {\n userHasScrolledRef.current = true;\n }\n\n const isAtBottom =\n Math.abs(el.scrollHeight - currentTop - el.clientHeight) <=\n scrollThreshold;\n if (isAtBottom) {\n userHasScrolledRef.current = false;\n }\n\n lastScrollTopRef.current = currentTop;\n }, []);\n\n useEffect(() => {\n const listElement = listRef.current;\n if (!listElement) return;\n\n listElement.addEventListener(\"scroll\", handleScroll);\n return () => {\n listElement.removeEventListener(\"scroll\", handleScroll);\n };\n }, [handleScroll]);\n\n // ========== 消息分组逻辑 ==========\n const chatGroups = useMemo(() => {\n if (!enableGrouping) {\n // 不分组,每条消息独立\n return messages.map((msg) => ({\n id: msg.id,\n role: msg.role,\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: msg.fileData || [],\n isLike: msg.isLike ?? 0,\n }));\n }\n\n const groups: ChatGroup[] = [];\n messages.forEach((msg) => {\n // 过滤 followup 消息\n if ((msg as any).role === \"followup\") return;\n\n const isRealUserQuery =\n msg.role === \"user\" && !msg.functionResponse && !msg.functionCall;\n const lastGroup = groups[groups.length - 1];\n const isLastGroupAgent = lastGroup?.role === \"bot\";\n\n if (isLastGroupAgent && !isRealUserQuery) {\n // 合并到上一个 bot 分组\n lastGroup.msgs.push(msg);\n if (msg.invocationId) lastGroup.invocationId = msg.invocationId;\n // 更新 isLike: 取最新的非0值,或保持当前值\n if (msg.isLike && msg.isLike !== 0) {\n lastGroup.isLike = msg.isLike;\n }\n } else {\n // 创建新分组\n groups.push({\n id: msg.id || `group-${groups.length}`,\n role: isRealUserQuery ? \"user\" : \"bot\",\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: [],\n isLike: msg.isLike ?? 0,\n });\n }\n });\n\n // 合并文件\n groups.forEach((g) => {\n g.allFiles = g.msgs.reduce(\n (acc, m) => [...acc, ...(m.fileData || [])],\n [] as any[],\n );\n });\n\n return groups;\n }, [messages, enableGrouping]);\n\n // ========== 渲染 Bot 消息组 ==========\n const renderBotGroup = useCallback(\n (group: ChatGroup, isLastGroup: boolean) => {\n const { msgs, allFiles } = group;\n\n if (!enableProcessParsing) {\n // 不解析 process,简单渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {msgs.map((msg, i) => {\n if (msg.text) {\n return (\n <MarkdownRender\n key={`${msg.id}-${i}`}\n text={msg.text}\n onFileClick={onFileClick}\n />\n );\n }\n if (msg.functionCall) {\n return (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n />\n );\n }\n return null;\n })}\n </div>\n );\n }\n\n // ========== 解析 Process 内容 ==========\n\n // 1. 合并工具调用\n const mergedToolMap = new Map<string, IMessage>();\n msgs.forEach((msg) => {\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!mergedToolMap.has(callId)) {\n mergedToolMap.set(callId, { ...msg });\n } else {\n mergedToolMap.set(callId, {\n ...(mergedToolMap.get(callId) ?? {}),\n ...msg,\n });\n }\n } else if (msg.functionResponse) {\n const callId = msg.functionResponse.id || \"\";\n if (mergedToolMap.has(callId)) {\n const tool = mergedToolMap.get(callId);\n if (tool) tool.functionResponse = msg.functionResponse;\n } else {\n mergedToolMap.set(callId, {\n ...msg,\n functionCall: {\n id: callId,\n name: msg.functionResponse.name || \"Unknown\",\n args: {},\n },\n });\n }\n }\n });\n\n // 2. 解析文本消息中的 process 内容\n type RenderNode =\n | { type: \"text\"; content: string; key: string }\n | { type: \"process\"; items: ThoughtChainItemType[]; key: string };\n\n const nodes: RenderNode[] = [];\n let currentProcessItems: ThoughtChainItemType[] = [];\n const processedToolIds = new Set<string>();\n\n const flushProcessItems = () => {\n if (currentProcessItems.length > 0) {\n nodes.push({\n type: \"process\",\n items: [...currentProcessItems],\n key: `process-${nodes.length}`,\n });\n currentProcessItems = [];\n }\n };\n\n msgs.forEach((msg) => {\n // 处理工具调用\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!processedToolIds.has(callId)) {\n const mergedMsg = mergedToolMap.get(callId);\n if (mergedMsg) {\n currentProcessItems.push({\n type: \"tool\",\n key: `tool-${callId}`,\n content: \"\",\n msg: mergedMsg,\n });\n processedToolIds.add(callId);\n }\n }\n }\n // 处理文本消息\n else if (msg.text && !msg.functionResponse) {\n const parts = parseAgentMessage(msg.text, parseOptions as any);\n\n parts.forEach((part, partIdx) => {\n // process 内容放入 currentProcessItems\n if (\n [\n \"planning\",\n \"replanning\",\n \"reasoning\",\n \"action_log\",\n \"process_text\",\n ].includes(part.type)\n ) {\n const titleMap: Record<string, string> = {\n planning: \"任务规划\",\n replanning: \"重新规划\",\n reasoning: \"推理分析\",\n action_log: \"行动记录\",\n process_text: \"过程分析\",\n };\n\n currentProcessItems.push({\n type: \"text\",\n key: `${msg.id}-${partIdx}`,\n content: part.content,\n title: titleMap[part.type] || \"分析\",\n });\n }\n // 普通文本内容\n else {\n flushProcessItems();\n if (part.content.trim()) {\n const lastNode = nodes[nodes.length - 1];\n if (lastNode?.type === \"text\") {\n // 合并到上一个文本节点\n lastNode.content += \"\\n\\n\" + part.content;\n } else {\n nodes.push({\n type: \"text\",\n content: part.content,\n key: `text-${msg.id}-${partIdx}`,\n });\n }\n }\n }\n });\n }\n });\n\n // 最后flush一次\n flushProcessItems();\n\n // 3. 准备操作栏数据\n const fullTextToCopy = msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n const lastBotMsg = msgs[msgs.length - 1];\n const hasProcess = nodes.some((n) => n.type === \"process\");\n const isGroupLoading = loading && isLastGroup;\n\n // 4. 渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n return (\n <XAdkThoughtChain\n key={node.key}\n loading={isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isGroupLoading}\n />\n );\n }\n\n // 文本节点\n const showBadge =\n hasProcess && nodes.findIndex((n) => n.type === \"text\") === idx;\n return (\n <div key={node.key}>\n {showBadge && (\n <div className={styles.successBadge}>\n <CheckCircleFilled /> 已完成所有规划任务\n </div>\n )}\n <MarkdownRender text={node.content} onFileClick={onFileClick} />\n </div>\n );\n })}\n\n {/* 文件展示 */}\n {allFiles.length > 0 && (\n <div className={styles.fileSection}>\n <div className={styles.fileHeader}>\n <span>生成文件 ({allFiles.length})</span>\n </div>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"8px\" }}>\n {allFiles.map((file, index) => (\n <FileGallery key={index} file={file} onClick={onFileClick} />\n ))}\n </div>\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions\n ? actions({ message: group, isLastBotMsg: isLastGroup })\n : (showRetry || showCopy || showLog) && (\n <div className={styles.metaFooter}>\n <Flex gap={16} className={styles.actionIcons}>\n {showRetry && isLastGroup && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined onClick={onRetry} />\n </Tooltip>\n )}\n {showCopy && (\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n onClick={() => {\n copy(fullTextToCopy);\n antdMessage.success(\"复制成功\");\n onCopy?.(fullTextToCopy);\n }}\n />\n </Tooltip>\n )}\n {showLog && lastBotMsg?.invocationId && (\n <Tooltip title=\"查看日志\">\n <InfoCircleOutlined\n onClick={() =>\n onShowLog?.(\n lastBotMsg.invocationId!,\n lastBotMsg.timestamp,\n )\n }\n />\n </Tooltip>\n )}\n </Flex>\n </div>\n ))}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n onFileClick,\n styles,\n ],\n );\n\n // ========== 渲染用户消息组 ==========\n const renderUserGroup = useCallback(\n (group: ChatGroup) => {\n return (\n <div key={group.id} className={styles.userMsg}>\n {group.msgs.map((m, i) => (\n <div key={m.id || i} className={styles.userContainer}>\n {/* 文件展示 */}\n {m.fileData && m.fileData.length > 0 && (\n <>\n {m.fileData.map((file, index) => (\n <FileGallery\n key={index}\n file={file}\n align=\"left\"\n style={{ marginBottom: \"16px\" }}\n onClick={onFileClick}\n />\n ))}\n </>\n )}\n {/* 文本展示 */}\n {m.text && <div className={styles.card}>{m.text}</div>}\n </div>\n ))}\n </div>\n );\n },\n [styles, onFileClick],\n );\n\n // ========== 欢迎页面 ==========\n // const isEmpty =\n // messages.length === 0 &&\n // !prologue &&\n // (!suggestions || suggestions.length === 0);\n\n // const renderWelcome = () => {\n // if (!isEmpty) return null;\n\n // return (\n // <>\n // {welcome ?? (\n // <div className={styles.welcomeWrapper}>\n // {agentIcon && (\n // <img src={agentIcon} alt=\"icon\" className={styles.welcomeIcon} />\n // )}\n // {agentName && (\n // <div className={styles.welcomeTitle}>{agentName}</div>\n // )}\n // {description && (\n // <div className={styles.welcomeDesc}>{description}</div>\n // )}\n // </div>\n // )}\n // </>\n // );\n // };\n\n // ========== 渲染建议问题 ==========\n const renderSuggestions = () => {\n if (!suggestions || suggestions.length === 0) return null;\n\n return (\n <div className={styles.suggestionWrapper}>\n {suggestions.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPosition=\"end\"\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n style={{\n whiteSpace: \"normal\",\n height: \"auto\",\n wordWrap: \"break-word\",\n textAlign: \"left\",\n padding: \"4px 15px\",\n lineHeight: \"1.5\",\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender text={prologue} onFileClick={onFileClick} />\n </div>\n )}\n\n {/* 欢迎页面 */}\n {/* {renderWelcome()} */}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(group, idx === chatGroups.length - 1),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n};\n\nexport default XAdkChatbot;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA+D;AAC/D,kBAA8D;AAC9D,kBAAiB;AACjB,mBAMO;AACP,+BAAiB;AACjB,oBAA0B;AAC1B,4BAA2B;AAC3B,gCAA+B;AAC/B,yBAAwB;AACxB,8BAA6B;AAC7B,mBAAkC;
|
|
6
|
-
"names": ["MarkdownRender", "FunctionCallRender", "XAdkThoughtChain", "FileGallery", "copy", "antdMessage", "clsx"]
|
|
4
|
+
"sourcesContent": ["import React, { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { Button, Flex, Tooltip, message as antdMessage } from \"antd\";\nimport clsx from \"clsx\";\nimport {\n SwapRightOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n CheckCircleFilled,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport { useStyles } from \"./styles\";\nimport MarkdownRender from \"./components/MarkdownRender\";\nimport FunctionCallRender from \"./components/FunctionCallRender\";\nimport FileGallery from \"../FileGallery\";\nimport XAdkThoughtChain from \"@/components/XAdkThoughtChain\";\nimport { parseAgentMessage } from \"@/utils\";\nimport { mergeChatStrategies } from \"@/presets/xGroupAdk\";\nimport type { IMessage, XAdkChatbotProps, ChatGroup } from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAdkThoughtChain\";\nimport { defaultToolKindResolver } from \"@/types/FunctionCallRender\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot: React.FC<XAdkChatbotProps> = ({\n loading = false,\n prologue,\n suggestions,\n messages,\n showFnCallDetail,\n onConfirm,\n onSuggest,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n initialized = false,\n onFileClick,\n renderFunctionCall,\n toolKindResolver,\n strategies,\n preset,\n}) => {\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement>(null);\n const lastScrollTopRef = useRef(0);\n const userHasScrolledRef = useRef(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const prevInitializedRef = useRef(false);\n const mergedStrategies = useMemo(\n () => mergeChatStrategies(preset, strategies),\n [preset, strategies],\n );\n const resolveToolKind = useCallback(\n (name?: string, msg?: IMessage) =>\n toolKindResolver?.(name) ??\n mergedStrategies.resolveToolKind?.({ name, msg }) ??\n defaultToolKindResolver(name),\n [toolKindResolver, mergedStrategies],\n );\n const parseProcessMessage =\n mergedStrategies.parseProcessMessage ?? parseAgentMessage;\n\n // 初始化完成时滚动到底部\n useEffect(() => {\n if (!initialized) return;\n if (!messages.length) return;\n if (prevInitializedRef.current) return; // 只在第一次 initialized+messages 就绪时触发\n prevInitializedRef.current = true;\n // 推迟到浏览器完成 paint 后执行,确保 DOM 高度已撑开\n const timer = setTimeout(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"auto\" });\n }, 0);\n return () => clearTimeout(timer);\n }, [initialized, messages]);\n\n // 流式输出时滚动到底部\n useEffect(() => {\n if (!loading) return;\n if (userHasScrolledRef.current) return;\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [loading, messages]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const currentTop = el.scrollTop;\n\n if (currentTop < lastScrollTopRef.current) {\n userHasScrolledRef.current = true;\n }\n\n const isAtBottom =\n Math.abs(el.scrollHeight - currentTop - el.clientHeight) <=\n scrollThreshold;\n if (isAtBottom) {\n userHasScrolledRef.current = false;\n }\n\n lastScrollTopRef.current = currentTop;\n }, []);\n\n useEffect(() => {\n const listElement = listRef.current;\n if (!listElement) return;\n\n listElement.addEventListener(\"scroll\", handleScroll);\n return () => {\n listElement.removeEventListener(\"scroll\", handleScroll);\n };\n }, [handleScroll]);\n\n // ========== 消息分组逻辑 ==========\n const chatGroups = useMemo(() => {\n if (!enableGrouping) {\n // 不分组,每条消息独立\n return messages.map((msg) => ({\n id: msg.id,\n role: msg.role,\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: msg.fileData || [],\n isLike: msg.isLike ?? 0,\n }));\n }\n\n const groups: ChatGroup[] = [];\n messages.forEach((msg) => {\n // 过滤 followup 消息\n if ((msg as any).role === \"followup\") return;\n\n const isRealUserQuery =\n msg.role === \"user\" && !msg.functionResponse && !msg.functionCall;\n const lastGroup = groups[groups.length - 1];\n const isLastGroupAgent = lastGroup?.role === \"bot\";\n\n if (isLastGroupAgent && !isRealUserQuery) {\n // 合并到上一个 bot 分组\n lastGroup.msgs.push(msg);\n if (msg.invocationId) lastGroup.invocationId = msg.invocationId;\n // 更新 isLike: 取最新的非0值,或保持当前值\n if (msg.isLike && msg.isLike !== 0) {\n lastGroup.isLike = msg.isLike;\n }\n } else {\n // 创建新分组\n groups.push({\n id: msg.id || `group-${groups.length}`,\n role: isRealUserQuery ? \"user\" : \"bot\",\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: [],\n isLike: msg.isLike ?? 0,\n });\n }\n });\n\n // 合并文件\n groups.forEach((g) => {\n g.allFiles = g.msgs.reduce(\n (acc, m) => [...acc, ...(m.fileData || [])],\n [] as any[],\n );\n });\n\n return groups;\n }, [messages, enableGrouping]);\n\n // ========== 渲染 Bot 消息组 ==========\n const renderBotGroup = useCallback(\n (group: ChatGroup, isLastGroup: boolean, renderFunctionCall?: XAdkChatbotProps[\"renderFunctionCall\"]) => {\n const { msgs, allFiles } = group;\n\n if (!enableProcessParsing) {\n // 不解析 process,简单渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {msgs.map((msg, i) => {\n if (msg.text) {\n return (\n <MarkdownRender\n key={`${msg.id}-${i}`}\n text={msg.text}\n onFileClick={onFileClick}\n />\n );\n }\n if (msg.functionCall) {\n return (\n renderFunctionCall?.(msg) ?? (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n kind={resolveToolKind(msg.functionCall?.name, msg)}\n renderApproval={mergedStrategies.renderApproval}\n renderHandoff={mergedStrategies.renderHandoff}\n />\n )\n );\n }\n return null;\n })}\n </div>\n );\n }\n\n // ========== 解析 Process 内容 ==========\n\n // 1. 合并工具调用\n const mergedToolMap = new Map<string, IMessage>();\n msgs.forEach((msg) => {\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!mergedToolMap.has(callId)) {\n mergedToolMap.set(callId, { ...msg });\n } else {\n mergedToolMap.set(callId, {\n ...(mergedToolMap.get(callId) ?? {}),\n ...msg,\n });\n }\n } else if (msg.functionResponse) {\n const callId = msg.functionResponse.id || \"\";\n if (mergedToolMap.has(callId)) {\n const tool = mergedToolMap.get(callId);\n if (tool) tool.functionResponse = msg.functionResponse;\n } else {\n mergedToolMap.set(callId, {\n ...msg,\n functionCall: {\n id: callId,\n name: msg.functionResponse.name || \"Unknown\",\n args: {},\n },\n });\n }\n }\n });\n\n // 2. 解析文本消息中的 process 内容\n type RenderNode =\n | { type: \"text\"; content: string; key: string }\n | { type: \"process\"; items: ThoughtChainItemType[]; key: string };\n\n const nodes: RenderNode[] = [];\n let currentProcessItems: ThoughtChainItemType[] = [];\n const processedToolIds = new Set<string>();\n\n const flushProcessItems = () => {\n if (currentProcessItems.length > 0) {\n nodes.push({\n type: \"process\",\n items: [...currentProcessItems],\n key: `process-${nodes.length}`,\n });\n currentProcessItems = [];\n }\n };\n\n msgs.forEach((msg) => {\n // 处理工具调用\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!processedToolIds.has(callId)) {\n const mergedMsg = mergedToolMap.get(callId);\n if (mergedMsg) {\n currentProcessItems.push({\n type: \"tool\",\n key: `tool-${callId}`,\n content: \"\",\n msg: mergedMsg,\n });\n processedToolIds.add(callId);\n }\n }\n }\n // 处理文本消息\n else if (msg.text && !msg.functionResponse) {\n const parts = parseProcessMessage(msg.text, parseOptions as any);\n\n parts.forEach((part, partIdx) => {\n // process 内容放入 currentProcessItems\n if (\n [\n \"planning\",\n \"replanning\",\n \"reasoning\",\n \"action_log\",\n \"process_text\",\n ].includes(part.type)\n ) {\n const titleMap: Record<string, string> = {\n planning: \"任务规划\",\n replanning: \"重新规划\",\n reasoning: \"推理分析\",\n action_log: \"行动记录\",\n process_text: \"过程分析\",\n };\n\n currentProcessItems.push({\n type: \"text\",\n key: `${msg.id}-${partIdx}`,\n content: part.content,\n title: titleMap[part.type] || \"分析\",\n });\n }\n // 普通文本内容\n else {\n flushProcessItems();\n if (part.content.trim()) {\n const lastNode = nodes[nodes.length - 1];\n if (lastNode?.type === \"text\") {\n // 合并到上一个文本节点\n lastNode.content += \"\\n\\n\" + part.content;\n } else {\n nodes.push({\n type: \"text\",\n content: part.content,\n key: `text-${msg.id}-${partIdx}`,\n });\n }\n }\n }\n });\n }\n });\n\n // 最后flush一次\n flushProcessItems();\n\n // 3. 准备操作栏数据\n const fullTextToCopy = msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n const lastBotMsg = msgs[msgs.length - 1];\n const hasProcess = nodes.some((n) => n.type === \"process\");\n const isGroupLoading = loading && isLastGroup;\n\n // 4. 渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n return (\n <XAdkThoughtChain\n key={node.key}\n loading={isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isGroupLoading}\n renderFunctionCall={renderFunctionCall}\n toolKindResolver={(name) => resolveToolKind(name)}\n strategies={mergedStrategies}\n />\n );\n }\n\n // 文本节点\n const showBadge =\n hasProcess && nodes.findIndex((n) => n.type === \"text\") === idx;\n return (\n <div key={node.key}>\n {showBadge && (\n <div className={styles.successBadge}>\n <CheckCircleFilled /> 已完成所有规划任务\n </div>\n )}\n <MarkdownRender text={node.content} onFileClick={onFileClick} />\n </div>\n );\n })}\n\n {/* 文件展示 */}\n {allFiles.length > 0 && (\n <div className={styles.fileSection}>\n <div className={styles.fileHeader}>\n <span>生成文件 ({allFiles.length})</span>\n </div>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"8px\" }}>\n {allFiles.map((file, index) => (\n <FileGallery key={index} file={file} onClick={onFileClick} />\n ))}\n </div>\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions\n ? actions({ message: group, isLastBotMsg: isLastGroup })\n : (showRetry || showCopy || showLog) && (\n <div className={styles.metaFooter}>\n <Flex gap={16} className={styles.actionIcons}>\n {showRetry && isLastGroup && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined onClick={onRetry} />\n </Tooltip>\n )}\n {showCopy && (\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n onClick={() => {\n copy(fullTextToCopy);\n antdMessage.success(\"复制成功\");\n onCopy?.(fullTextToCopy);\n }}\n />\n </Tooltip>\n )}\n {showLog && lastBotMsg?.invocationId && (\n <Tooltip title=\"查看日志\">\n <InfoCircleOutlined\n onClick={() =>\n onShowLog?.(\n lastBotMsg.invocationId!,\n lastBotMsg.timestamp,\n )\n }\n />\n </Tooltip>\n )}\n </Flex>\n </div>\n ))}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n parseProcessMessage,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n onFileClick,\n styles,\n resolveToolKind,\n mergedStrategies,\n ],\n );\n\n // ========== 渲染用户消息组 ==========\n const renderUserGroup = useCallback(\n (group: ChatGroup) => {\n return (\n <div key={group.id} className={styles.userMsg}>\n {group.msgs.map((m, i) => (\n <div key={m.id || i} className={styles.userContainer}>\n {/* 文件展示 */}\n {m.fileData && m.fileData.length > 0 && (\n <>\n {m.fileData.map((file, index) => (\n <FileGallery\n key={index}\n file={file}\n align=\"left\"\n style={{ marginBottom: \"16px\" }}\n onClick={onFileClick}\n />\n ))}\n </>\n )}\n {/* 文本展示 */}\n {m.text && <div className={styles.card}>{m.text}</div>}\n </div>\n ))}\n </div>\n );\n },\n [styles, onFileClick],\n );\n\n // ========== 欢迎页面 ==========\n // const isEmpty =\n // messages.length === 0 &&\n // !prologue &&\n // (!suggestions || suggestions.length === 0);\n\n // const renderWelcome = () => {\n // if (!isEmpty) return null;\n\n // return (\n // <>\n // {welcome ?? (\n // <div className={styles.welcomeWrapper}>\n // {agentIcon && (\n // <img src={agentIcon} alt=\"icon\" className={styles.welcomeIcon} />\n // )}\n // {agentName && (\n // <div className={styles.welcomeTitle}>{agentName}</div>\n // )}\n // {description && (\n // <div className={styles.welcomeDesc}>{description}</div>\n // )}\n // </div>\n // )}\n // </>\n // );\n // };\n\n // ========== 渲染建议问题 ==========\n const renderSuggestions = () => {\n if (!suggestions || suggestions.length === 0) return null;\n\n return (\n <div className={styles.suggestionWrapper}>\n {suggestions.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPosition=\"end\"\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n style={{\n whiteSpace: \"normal\",\n height: \"auto\",\n wordWrap: \"break-word\",\n textAlign: \"left\",\n padding: \"4px 15px\",\n lineHeight: \"1.5\",\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender text={prologue} onFileClick={onFileClick} />\n </div>\n )}\n\n {/* 欢迎页面 */}\n {/* {renderWelcome()} */}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(group, idx === chatGroups.length - 1, renderFunctionCall),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n};\n\nexport default XAdkChatbot;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_FunctionCallRender", "renderFunctionCall", "MarkdownRender", "FunctionCallRender", "XAdkThoughtChain", "FileGallery", "copy", "antdMessage", "clsx"]
|
|
7
7
|
}
|