@blueking/chat-x 0.0.5 → 0.0.6
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/dist/mcp/generated/docs/activity-message.md +428 -0
- package/dist/mcp/generated/docs/ai-image.md +227 -0
- package/dist/mcp/generated/docs/ai-loading.md +129 -0
- package/dist/mcp/generated/docs/ai-selection.md +436 -0
- package/dist/mcp/generated/docs/animation-text.md +199 -0
- package/dist/mcp/generated/docs/assistant-message.md +424 -0
- package/dist/mcp/generated/docs/chat-container.md +365 -0
- package/dist/mcp/generated/docs/chat-input.md +625 -0
- package/dist/mcp/generated/docs/cite-content.md +138 -0
- package/dist/mcp/generated/docs/code-content.md +199 -0
- package/dist/mcp/generated/docs/common-error-content.md +70 -0
- package/dist/mcp/generated/docs/constants.md +216 -0
- package/dist/mcp/generated/docs/content-render.md +238 -0
- package/dist/mcp/generated/docs/delete-tool.md +188 -0
- package/dist/mcp/generated/docs/desc-panel.md +139 -0
- package/dist/mcp/generated/docs/execution-summary.md +126 -0
- package/dist/mcp/generated/docs/file-content.md +300 -0
- package/dist/mcp/generated/docs/file-upload-btn.md +174 -0
- package/dist/mcp/generated/docs/flow-message.md +305 -0
- package/dist/mcp/generated/docs/highlight-keyword.md +144 -0
- package/dist/mcp/generated/docs/image-content.md +178 -0
- package/dist/mcp/generated/docs/image-preview-group.md +181 -0
- package/dist/mcp/generated/docs/image-preview.md +224 -0
- package/dist/mcp/generated/docs/info-message.md +124 -0
- package/dist/mcp/generated/docs/key-value-content.md +124 -0
- package/dist/mcp/generated/docs/latex-content.md +196 -0
- package/dist/mcp/generated/docs/loading-message.md +171 -0
- package/dist/mcp/generated/docs/markdown-content.md +186 -0
- package/dist/mcp/generated/docs/markdown-latex.md +208 -0
- package/dist/mcp/generated/docs/markdown-mermaid.md +250 -0
- package/dist/mcp/generated/docs/mermaid-content.md +185 -0
- package/dist/mcp/generated/docs/message-container.md +534 -0
- package/dist/mcp/generated/docs/message-render.md +329 -0
- package/dist/mcp/generated/docs/message-tools.md +376 -0
- package/dist/mcp/generated/docs/messages.md +472 -0
- package/dist/mcp/generated/docs/overflow-tips.md +209 -0
- package/dist/mcp/generated/docs/reasoning-message.md +233 -0
- package/dist/mcp/generated/docs/reference-content.md +132 -0
- package/dist/mcp/generated/docs/scroll-btn.md +155 -0
- package/dist/mcp/generated/docs/selection-footer.md +75 -0
- package/dist/mcp/generated/docs/shortcut-btn.md +202 -0
- package/dist/mcp/generated/docs/shortcut-btns.md +264 -0
- package/dist/mcp/generated/docs/shortcut-render.md +418 -0
- package/dist/mcp/generated/docs/text-content.md +74 -0
- package/dist/mcp/generated/docs/theme.md +388 -0
- package/dist/mcp/generated/docs/tool-btn.md +254 -0
- package/dist/mcp/generated/docs/tool-message.md +217 -0
- package/dist/mcp/generated/docs/toolcall-render.md +299 -0
- package/dist/mcp/generated/docs/use-animation-text.md +198 -0
- package/dist/mcp/generated/docs/use-clipboard.md +206 -0
- package/dist/mcp/generated/docs/use-command-selection.md +128 -0
- package/dist/mcp/generated/docs/use-container-scroll.md +56 -0
- package/dist/mcp/generated/docs/use-custom-tab.md +122 -0
- package/dist/mcp/generated/docs/use-global-config.md +154 -0
- package/dist/mcp/generated/docs/use-menu-keydown.md +164 -0
- package/dist/mcp/generated/docs/use-message-group.md +175 -0
- package/dist/mcp/generated/docs/use-observer-visible-list.md +189 -0
- package/dist/mcp/generated/docs/use-parent-scrolling.md +46 -0
- package/dist/mcp/generated/docs/user-feedback.md +229 -0
- package/dist/mcp/generated/docs/user-message.md +347 -0
- package/dist/mcp/generated/index.json +1311 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +42 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +43 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/get-component-doc.d.ts +19 -0
- package/dist/mcp/tools/get-component-doc.js +60 -0
- package/dist/mcp/tools/get-component-doc.js.map +1 -0
- package/dist/mcp/tools/list-components.d.ts +35 -0
- package/dist/mcp/tools/list-components.js +147 -0
- package/dist/mcp/tools/list-components.js.map +1 -0
- package/dist/mcp/tools/search-docs.d.ts +14 -0
- package/dist/mcp/tools/search-docs.js +82 -0
- package/dist/mcp/tools/search-docs.js.map +1 -0
- package/dist/mcp/utils/doc-loader.d.ts +35 -0
- package/dist/mcp/utils/doc-loader.js +64 -0
- package/dist/mcp/utils/doc-loader.js.map +1 -0
- package/package.json +5 -7
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
ActivityMessage 展示活动类消息:知识检索(knowledge_rag)、引用文档列表、FlowAgent 执行(activityType 区分),标题可折叠。 content 结构随模式变化。由 MessageRender 在 activity 角色下渲染,用于 RAG/引用/流程执行过程可视化。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **message-render** — 由 MessageRender 在 role 为 activity 时创建
|
|
8
|
+
- **flow-message** — 与流程编排执行可视化同属一类场景,组件形态不同
|
|
9
|
+
- **assistant-message** — 常与助手回复相邻,描述检索或执行背景
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
<!-- FULL DOC -->
|
|
13
|
+
|
|
14
|
+
# ActivityMessage 活动消息
|
|
15
|
+
|
|
16
|
+
> **层级**:分子组件 · **功能域**:消息展示
|
|
17
|
+
|
|
18
|
+
活动消息组件,用于展示 AI 的知识检索(Knowledge RAG)过程、参考文档引用列表和 FlowAgent 流程执行情况。通过 `activityType` 切换三种工作模式,点击标题栏可折叠/展开内容区域。
|
|
19
|
+
|
|
20
|
+
## 三种工作模式
|
|
21
|
+
|
|
22
|
+
组件根据 `activityType` 的值决定渲染模式:
|
|
23
|
+
|
|
24
|
+
| `activityType` | 模式 | 标题文案 | 图标 | 内容区 |
|
|
25
|
+
| ----------------- | -------------- | ------------------------------------ | ---------------- | ----------------------------------- |
|
|
26
|
+
| `'knowledge_rag'` | 知识检索模式 | 检索中 / 检索完成(随 status 切换) | Loading / 文档 | Markdown 检索摘要 + 引用列表 |
|
|
27
|
+
| `'flow-agent'` | FlowAgent 模式 | 执行情况: 成功 N / 失败 N / 执行中 N | Loading / 箭头 | 任务节点树 + 节点详情(自定义 Tab) |
|
|
28
|
+
| 其他任意值 | 引用文档模式 | 引用 N 篇资料作为参考 | 文档图标(固定) | 引用文档列表 |
|
|
29
|
+
|
|
30
|
+
> **注意:** 只有值严格等于 `'knowledge_rag'` 才进入知识检索模式;严格等于 `'flow-agent'`(`MessageContentType.FlowAgent`)才进入 FlowAgent 模式;其他值均按引用文档模式处理。
|
|
31
|
+
|
|
32
|
+
## 引用文档模式
|
|
33
|
+
|
|
34
|
+
`activityType` 传入 `MessageContentType.ReferenceDocument`(`'reference_document'`)或任意非 `'knowledge_rag'` 的值,`content` 传入文档对象数组。
|
|
35
|
+
|
|
36
|
+
标题自动显示文档数量,始终展示文档图标,`status` 不影响标题和图标。
|
|
37
|
+
|
|
38
|
+
```vue
|
|
39
|
+
<template>
|
|
40
|
+
<ActivityMessage
|
|
41
|
+
v-model:collapsed="collapsed"
|
|
42
|
+
:content="docs"
|
|
43
|
+
status="complete"
|
|
44
|
+
:activity-type="MessageContentType.ReferenceDocument"
|
|
45
|
+
/>
|
|
46
|
+
</template>
|
|
47
|
+
|
|
48
|
+
<script setup lang="ts">
|
|
49
|
+
import { ref } from 'vue';
|
|
50
|
+
import { ActivityMessage, MessageContentType, MessageStatus } from '@blueking/chat-x';
|
|
51
|
+
|
|
52
|
+
const collapsed = ref(false);
|
|
53
|
+
|
|
54
|
+
const docs = [
|
|
55
|
+
{
|
|
56
|
+
name: 'Vue 3 组合式 API 指南',
|
|
57
|
+
url: 'https://cn.vuejs.org/guide/extras/composition-api-faq.html',
|
|
58
|
+
originFile: 'composition-api.md',
|
|
59
|
+
},
|
|
60
|
+
{ name: 'TypeScript 高级类型手册', url: 'https://www.typescriptlang.org/docs/', originFile: 'ts-advanced.pdf' },
|
|
61
|
+
{ name: '蓝鲸前端开发规范 v2.0', url: 'https://example.com/bk-standard', originFile: 'bk-standard.docx' },
|
|
62
|
+
];
|
|
63
|
+
</script>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**渲染效果**
|
|
67
|
+
|
|
68
|
+
## 知识检索模式
|
|
69
|
+
|
|
70
|
+
`activityType` 设为 `MessageContentType.KnowledgeRag`(`'knowledge_rag'`),`content` 传入包含 `content`(检索摘要)和 `referenceDocument`(引用文档列表)的对象。
|
|
71
|
+
|
|
72
|
+
标题和图标随 `status` 动态变化:
|
|
73
|
+
|
|
74
|
+
| `status` | 图标 | 标题 |
|
|
75
|
+
| ----------------------- | -------- | -------- |
|
|
76
|
+
| `pending` / `streaming` | Loading | 检索中 |
|
|
77
|
+
| 其他(`complete` 等) | 文档图标 | 检索完成 |
|
|
78
|
+
|
|
79
|
+
```vue
|
|
80
|
+
<template>
|
|
81
|
+
<ActivityMessage
|
|
82
|
+
v-model:collapsed="collapsed"
|
|
83
|
+
:content="ragContent"
|
|
84
|
+
:status="status"
|
|
85
|
+
:activity-type="MessageContentType.KnowledgeRag"
|
|
86
|
+
/>
|
|
87
|
+
</template>
|
|
88
|
+
|
|
89
|
+
<script setup lang="ts">
|
|
90
|
+
import { ref } from 'vue';
|
|
91
|
+
import { ActivityMessage, MessageContentType, MessageStatus } from '@blueking/chat-x';
|
|
92
|
+
|
|
93
|
+
const collapsed = ref(false);
|
|
94
|
+
const status = ref(MessageStatus.Complete);
|
|
95
|
+
|
|
96
|
+
const ragContent = {
|
|
97
|
+
// 检索摘要(支持 Markdown)
|
|
98
|
+
content: '根据知识库检索,Vue 3 引入了 Composition API...',
|
|
99
|
+
// 引用文档列表
|
|
100
|
+
referenceDocument: [
|
|
101
|
+
{ name: '知识库文档:Composition API 详解', url: 'https://example.com/kb1', originFile: 'kb1.md' },
|
|
102
|
+
],
|
|
103
|
+
};
|
|
104
|
+
</script>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**渲染效果(检索完成 + 单引用)**
|
|
108
|
+
|
|
109
|
+
**渲染效果(检索完成 + 多引用 + Markdown 摘要)**
|
|
110
|
+
|
|
111
|
+
## 状态变化(知识检索模式)
|
|
112
|
+
|
|
113
|
+
`knowledge_rag` 模式下,`status` 决定图标和标题文案:
|
|
114
|
+
|
|
115
|
+
**检索中(`pending`)**
|
|
116
|
+
|
|
117
|
+
**检索中(`streaming`)**
|
|
118
|
+
|
|
119
|
+
**检索完成(`complete`)**
|
|
120
|
+
|
|
121
|
+
> **引用文档模式**不受 `status` 影响,始终显示文档图标和文档数量,不会出现 Loading 动画。
|
|
122
|
+
|
|
123
|
+
## 折叠/展开
|
|
124
|
+
|
|
125
|
+
通过 `v-model:collapsed` 控制内容区的折叠状态,点击整个标题栏均可切换。默认为 `false`(展开)。
|
|
126
|
+
|
|
127
|
+
```vue
|
|
128
|
+
<template>
|
|
129
|
+
<!-- 默认展开 -->
|
|
130
|
+
<ActivityMessage
|
|
131
|
+
v-model:collapsed="collapsed"
|
|
132
|
+
:content="docs"
|
|
133
|
+
status="complete"
|
|
134
|
+
activity-type="reference_document"
|
|
135
|
+
/>
|
|
136
|
+
</template>
|
|
137
|
+
|
|
138
|
+
<script setup lang="ts">
|
|
139
|
+
import { ref } from 'vue';
|
|
140
|
+
import { ActivityMessage } from '@blueking/chat-x';
|
|
141
|
+
|
|
142
|
+
const collapsed = ref(false); // false = 展开,true = 折叠
|
|
143
|
+
const docs = [{ name: '参考文档', url: 'https://example.com/doc', originFile: 'doc.pdf' }];
|
|
144
|
+
</script>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**渲染效果(展开状态)**
|
|
148
|
+
|
|
149
|
+
**渲染效果(折叠状态)**
|
|
150
|
+
|
|
151
|
+
## FlowAgent 执行情况模式
|
|
152
|
+
|
|
153
|
+
`activityType` 设为 `MessageContentType.FlowAgent`(`'flow-agent'`),`content` 传入 `BkFlowMessageContent` 对象。用于展示蓝鲸标准运维(BkFlow)任务的执行状态、节点列表和统计信息。
|
|
154
|
+
|
|
155
|
+
### 核心交互
|
|
156
|
+
|
|
157
|
+
- **标题栏**:显示「执行情况」+ 各状态计数(执行中 / 成功 / 失败 / 挂起),颜色区分
|
|
158
|
+
- **任务组**:可折叠/展开的任务行,带状态图标和总耗时
|
|
159
|
+
- **节点列表**:每个节点显示状态圆点、名称和耗时;hover 时出现「详情」按钮
|
|
160
|
+
- **节点详情**:点击「详情」按钮会通过 `useCustomTabConsumer` 在 `ChatContainer` 侧边栏新增自定义 Tab,展示节点配置(基础信息、输入参数、输出参数)
|
|
161
|
+
|
|
162
|
+
### 内部渲染结构
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
FlowAgentContent(activityType = 'flow-agent')
|
|
166
|
+
├── ActivityLayout(公共折叠布局容器)
|
|
167
|
+
│ └── #title
|
|
168
|
+
│ ├── Loading / ArrowIcon(随 status 切换)
|
|
169
|
+
│ └── 执行情况:执行中 N / 成功 N / 失败 N / 挂起 N
|
|
170
|
+
└── #default
|
|
171
|
+
└── TaskGroup
|
|
172
|
+
├── TaskHeader(可折叠/展开)
|
|
173
|
+
│ ├── 状态图标(running=Loading / success / failed / suspended)
|
|
174
|
+
│ ├── task_name(HighlightKeyword 支持搜索高亮)
|
|
175
|
+
│ └── 总耗时
|
|
176
|
+
└── NodeList
|
|
177
|
+
└── NodeItem × N
|
|
178
|
+
├── 状态圆点(颜色对应状态)
|
|
179
|
+
├── node.name(HighlightKeyword 支持搜索高亮)
|
|
180
|
+
├── node.elapsed_time
|
|
181
|
+
└── 详情按钮(hover 显示)→ 打开自定义 Tab
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### 用法示例
|
|
185
|
+
|
|
186
|
+
```vue
|
|
187
|
+
<template>
|
|
188
|
+
<ActivityMessage
|
|
189
|
+
v-model:collapsed="collapsed"
|
|
190
|
+
:content="flowContent"
|
|
191
|
+
:status="status"
|
|
192
|
+
:activity-type="MessageContentType.FlowAgent"
|
|
193
|
+
/>
|
|
194
|
+
</template>
|
|
195
|
+
|
|
196
|
+
<script setup lang="ts">
|
|
197
|
+
import { ref } from 'vue';
|
|
198
|
+
import { ActivityMessage, MessageContentType, MessageStatus } from '@blueking/chat-x';
|
|
199
|
+
import type { BkFlowMessageContent } from '@blueking/chat-x';
|
|
200
|
+
|
|
201
|
+
const collapsed = ref(false);
|
|
202
|
+
const status = ref(MessageStatus.Complete);
|
|
203
|
+
|
|
204
|
+
const flowContent: BkFlowMessageContent = {
|
|
205
|
+
task_id: 100,
|
|
206
|
+
task_name: '数据清洗流程',
|
|
207
|
+
task_state: 'FINISHED',
|
|
208
|
+
task_outputs: [],
|
|
209
|
+
statistics: {
|
|
210
|
+
total: 3,
|
|
211
|
+
state_counts: { FINISHED: 2, FAILED: 1 },
|
|
212
|
+
},
|
|
213
|
+
nodes: {
|
|
214
|
+
node1: {
|
|
215
|
+
id: 'node1',
|
|
216
|
+
name: '数据拉取',
|
|
217
|
+
state: 'FINISHED',
|
|
218
|
+
elapsed_time: 12,
|
|
219
|
+
start_time: '2025-01-01 10:00:00',
|
|
220
|
+
finish_time: '2025-01-01 10:00:12',
|
|
221
|
+
loop: 1,
|
|
222
|
+
retry: 0,
|
|
223
|
+
skip: false,
|
|
224
|
+
type: 'ServiceActivity',
|
|
225
|
+
},
|
|
226
|
+
node2: {
|
|
227
|
+
id: 'node2',
|
|
228
|
+
name: '数据转换',
|
|
229
|
+
state: 'FINISHED',
|
|
230
|
+
elapsed_time: 45,
|
|
231
|
+
start_time: '2025-01-01 10:00:12',
|
|
232
|
+
finish_time: '2025-01-01 10:00:57',
|
|
233
|
+
loop: 1,
|
|
234
|
+
retry: 0,
|
|
235
|
+
skip: false,
|
|
236
|
+
type: 'ServiceActivity',
|
|
237
|
+
},
|
|
238
|
+
node3: {
|
|
239
|
+
id: 'node3',
|
|
240
|
+
name: '结果写入',
|
|
241
|
+
state: 'FAILED',
|
|
242
|
+
elapsed_time: 3,
|
|
243
|
+
start_time: '2025-01-01 10:00:57',
|
|
244
|
+
finish_time: '2025-01-01 10:01:00',
|
|
245
|
+
loop: 1,
|
|
246
|
+
retry: 0,
|
|
247
|
+
skip: false,
|
|
248
|
+
type: 'ServiceActivity',
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
</script>
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### 在 MessageContainer 中自动渲染
|
|
256
|
+
|
|
257
|
+
```typescript
|
|
258
|
+
const messages = [
|
|
259
|
+
{
|
|
260
|
+
id: '3',
|
|
261
|
+
role: 'activity',
|
|
262
|
+
activityType: MessageContentType.FlowAgent, // 'flow-agent'
|
|
263
|
+
status: MessageStatus.Streaming,
|
|
264
|
+
content: {
|
|
265
|
+
task_id: 100,
|
|
266
|
+
task_name: '数据清洗流程',
|
|
267
|
+
task_state: 'RUNNING',
|
|
268
|
+
task_outputs: [],
|
|
269
|
+
statistics: { total: 3, state_counts: { RUNNING: 1, FINISHED: 2 } },
|
|
270
|
+
nodes: {
|
|
271
|
+
/* ... */
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
},
|
|
275
|
+
];
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### 节点状态映射
|
|
279
|
+
|
|
280
|
+
组件内部将 BkFlow 原始状态归并为四种显示状态:
|
|
281
|
+
|
|
282
|
+
| 归并状态 | 原始状态 | 颜色 |
|
|
283
|
+
| ----------- | ----------------------------------------------------------------------------------- | ------- |
|
|
284
|
+
| `running` | CREATED / LOOP_READY / READY / RUNNING / BLOCKED / ROLLING_BACK / ROLL_BACK_SUCCESS | #3A84FF |
|
|
285
|
+
| `success` | FINISHED | #18B456 |
|
|
286
|
+
| `failed` | FAILED / REVOKED / ROLL_BACK_FAILED | #EA3636 |
|
|
287
|
+
| `suspended` | SUSPENDED | #F59500 |
|
|
288
|
+
|
|
289
|
+
### 节点详情 Tab
|
|
290
|
+
|
|
291
|
+
点击节点的「详情」按钮,内部调用 `useCustomTabConsumer().addCustomTab()` 在 `ChatContainer` 侧边栏新开一个 Tab,渲染 `FlowAgentNodeDetail` 组件,该组件提供:
|
|
292
|
+
|
|
293
|
+
- **节点配置** Tab:基础信息表单(流程模板、节点名称、步骤名称、失败处理、超时控制)+ 输入参数表 + 输出参数表
|
|
294
|
+
- **节点输出** Tab:结构化输出参数表
|
|
295
|
+
- **骨架屏**:`loading` 为 `true` 时展示骨架屏占位
|
|
296
|
+
|
|
297
|
+
### 相关类型定义
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
import { MessageContentType, type BkFlowMessageContent, type BkFlowNode } from '@blueking/chat-x';
|
|
301
|
+
|
|
302
|
+
type BkFlowMessageContent = {
|
|
303
|
+
nodes: Record<string, BkFlowNode>;
|
|
304
|
+
statistics: { state_counts: Record<string, number>; total: number };
|
|
305
|
+
task_id: number;
|
|
306
|
+
task_name: string;
|
|
307
|
+
task_outputs: unknown[];
|
|
308
|
+
task_state: string;
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
type BkFlowNode = {
|
|
312
|
+
elapsed_time: number;
|
|
313
|
+
finish_time: string;
|
|
314
|
+
id: string;
|
|
315
|
+
loop: number;
|
|
316
|
+
name: string;
|
|
317
|
+
retry: number;
|
|
318
|
+
skip: boolean;
|
|
319
|
+
start_time: string;
|
|
320
|
+
state: string;
|
|
321
|
+
type: string;
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
enum MessageContentType {
|
|
325
|
+
FlowAgent = 'flow-agent',
|
|
326
|
+
KnowledgeRag = 'knowledge-rag',
|
|
327
|
+
ReferenceDocument = 'reference-document',
|
|
328
|
+
// ...
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
## 在 MessageContainer 中使用
|
|
333
|
+
|
|
334
|
+
`ActivityMessage` 通常不需要单独使用,`MessageContainer` 会对 `role: 'activity'` 的消息自动渲染:
|
|
335
|
+
|
|
336
|
+
```vue
|
|
337
|
+
<template>
|
|
338
|
+
<MessageContainer :messages="messages" />
|
|
339
|
+
</template>
|
|
340
|
+
|
|
341
|
+
<script setup lang="ts">
|
|
342
|
+
import { MessageContainer, MessageContentType, MessageStatus } from '@blueking/chat-x';
|
|
343
|
+
|
|
344
|
+
const messages = [
|
|
345
|
+
// 知识检索消息
|
|
346
|
+
{
|
|
347
|
+
id: '1',
|
|
348
|
+
role: 'activity',
|
|
349
|
+
activityType: MessageContentType.KnowledgeRag, // 'knowledge_rag'
|
|
350
|
+
status: MessageStatus.Complete,
|
|
351
|
+
content: {
|
|
352
|
+
content: '根据知识库检索到以下相关信息...',
|
|
353
|
+
referenceDocument: [{ name: '文档A', url: 'https://example.com/a', originFile: 'a.md' }],
|
|
354
|
+
},
|
|
355
|
+
},
|
|
356
|
+
// 引用文档消息
|
|
357
|
+
{
|
|
358
|
+
id: '2',
|
|
359
|
+
role: 'activity',
|
|
360
|
+
activityType: MessageContentType.ReferenceDocument, // 'reference_document'
|
|
361
|
+
status: MessageStatus.Complete,
|
|
362
|
+
content: [
|
|
363
|
+
{ name: '参考文档1', url: 'https://example.com/doc1', originFile: 'doc1.pdf' },
|
|
364
|
+
{ name: '参考文档2', url: 'https://example.com/doc2', originFile: 'doc2.pdf' },
|
|
365
|
+
],
|
|
366
|
+
},
|
|
367
|
+
];
|
|
368
|
+
</script>
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
## API
|
|
372
|
+
|
|
373
|
+
### Props
|
|
374
|
+
|
|
375
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
376
|
+
| ------------ | --------------------------------------------------------------------------- | ------ | --------------------------------------------------------- |
|
|
377
|
+
| content | `ReferenceDocumentContent[] \| KnowledgeRagContent \| BkFlowMessageContent` | - | 内容数据,格式随 `activityType` 不同 |
|
|
378
|
+
| activityType | `'knowledge_rag' \| 'flow-agent' \| 'reference_document' \| string` | - | 活动类型,决定渲染模式(知识检索 / FlowAgent / 引用文档) |
|
|
379
|
+
| status | `MessageStatus` | - | 消息状态,仅在 `knowledge_rag` 模式下影响标题和图标 |
|
|
380
|
+
| id | `string \| number` | - | 消息 ID |
|
|
381
|
+
| messageId | `string \| number` | - | 消息唯一标识 |
|
|
382
|
+
|
|
383
|
+
### v-model
|
|
384
|
+
|
|
385
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
386
|
+
| --------- | --------- | ------- | --------------------------- |
|
|
387
|
+
| collapsed | `boolean` | `false` | 内容折叠状态,`true` 为折叠 |
|
|
388
|
+
|
|
389
|
+
## 类型定义
|
|
390
|
+
|
|
391
|
+
```typescript
|
|
392
|
+
import { MessageContentType } from '@blueking/chat-x';
|
|
393
|
+
|
|
394
|
+
// 引用文档条目
|
|
395
|
+
type ReferenceDocumentContent = {
|
|
396
|
+
name: string; // 文档名称(显示文本)
|
|
397
|
+
url: string; // 文档访问链接
|
|
398
|
+
originFile: string; // 原始文件名
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
// 知识检索内容(knowledge_rag 模式)
|
|
402
|
+
interface KnowledgeRagContent {
|
|
403
|
+
content: string; // 检索摘要,支持 Markdown
|
|
404
|
+
referenceDocument: ReferenceDocumentContent[]; // 引用文档列表
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// activityType 枚举值
|
|
408
|
+
enum MessageContentType {
|
|
409
|
+
FlowAgent = 'flow-agent',
|
|
410
|
+
KnowledgeRag = 'knowledge-rag',
|
|
411
|
+
ReferenceDocument = 'reference-document',
|
|
412
|
+
// ...
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
## 使用场景
|
|
417
|
+
|
|
418
|
+
- **知识检索过程**:以 `knowledge_rag` 模式展示 RAG 检索全过程,从"检索中"到"检索完成"的状态流转
|
|
419
|
+
- **参考资料引用**:以 `reference_document` 模式展示 AI 回复所引用的参考文档列表
|
|
420
|
+
- **FlowAgent 执行监控**:以 `flow-agent` 模式展示 BkFlow 流程执行状态、节点列表和详情
|
|
421
|
+
- **流式场景**:`pending` → `streaming` → `complete` 状态变化配合流式响应实时更新
|
|
422
|
+
- **自动渲染**:通过 `MessageContainer` 或 `MessageRender` 自动处理 `role: 'activity'` 消息,无需手动引入
|
|
423
|
+
|
|
424
|
+
## 关联组件
|
|
425
|
+
|
|
426
|
+
- [MessageRender](./message-render.md) — activity 角色由其实例化
|
|
427
|
+
- [FlowMessage](./flow-message.md) — 独立流程消息与 FlowAgent 模式场景相近
|
|
428
|
+
- [AssistantMessage](./assistant-message.md) — 常与助手主回复配合出现
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
AiImage 负责缩略图展示,并处理加载中、失败重试与懒加载;无 ImagePreviewGroup 上下文时可内嵌 ImagePreview 做全屏预览。 在 Group 内通过 inject 注册子图,点击时参与多图集合预览;支持自定义下载与 preview 事件。 与 ImagePreview、ImagePreviewGroup 共同构成对话内图片展示与预览链路。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **image-preview** — 独立模式下内嵌全屏预览,单图预览入口
|
|
8
|
+
- **image-preview-group** — 组内注册子图并统一打开多图预览
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
<!-- FULL DOC -->
|
|
12
|
+
|
|
13
|
+
# AiImage 图片展示
|
|
14
|
+
|
|
15
|
+
> **层级**:原子组件 · **功能域**:文件与图片
|
|
16
|
+
|
|
17
|
+
图片展示组件,支持加载状态、加载失败重试、懒加载、点击预览等功能。可独立使用(单图预览),也可配合 `ImagePreviewGroup` 实现多图预览。
|
|
18
|
+
|
|
19
|
+
## 组件结构
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
.ai-image(display: inline-block,border-radius: 4px)
|
|
23
|
+
├── <img>(v-if status !== 'error' && actualSrc,object-fit: cover)
|
|
24
|
+
├── .ai-image-error(v-if status === 'error')
|
|
25
|
+
│ └── ImageErrorIcon(24×24,color: #c4c6cc)
|
|
26
|
+
├── .ai-image-error-overlay(v-if status === 'error',hover 时显示)
|
|
27
|
+
│ ├── ReloadIcon(16×16)
|
|
28
|
+
│ └── <span>"重新加载"</span>
|
|
29
|
+
├── <slot />
|
|
30
|
+
└── ImagePreview(v-if !groupContext && preview && previewVisible)
|
|
31
|
+
独立模式下的内置全屏预览
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 基础用法
|
|
35
|
+
|
|
36
|
+
```vue
|
|
37
|
+
<template>
|
|
38
|
+
<AiImage
|
|
39
|
+
src="https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=400&h=300&fit=crop"
|
|
40
|
+
:width="200"
|
|
41
|
+
:height="150"
|
|
42
|
+
alt="风景图"
|
|
43
|
+
@load="handleLoad"
|
|
44
|
+
@error="handleError"
|
|
45
|
+
@preview="handlePreview"
|
|
46
|
+
/>
|
|
47
|
+
</template>
|
|
48
|
+
|
|
49
|
+
<script setup lang="ts">
|
|
50
|
+
import { AiImage } from '@blueking/chat-x';
|
|
51
|
+
|
|
52
|
+
const handleLoad = (ev: Event) => {
|
|
53
|
+
console.log('图片加载成功', ev);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const handleError = (ev: Event) => {
|
|
57
|
+
console.log('图片加载失败', ev);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const handlePreview = () => {
|
|
61
|
+
console.log('触发预览');
|
|
62
|
+
};
|
|
63
|
+
</script>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 加载失败与重新加载
|
|
67
|
+
|
|
68
|
+
当图片加载失败时,显示错误占位图标,鼠标悬停后出现"重新加载"遮罩,点击可重新加载(内部通过追加时间戳参数实现缓存破坏):
|
|
69
|
+
|
|
70
|
+
```vue
|
|
71
|
+
<template>
|
|
72
|
+
<AiImage
|
|
73
|
+
src="https://invalid-url.example.com/not-exist.png"
|
|
74
|
+
:width="200"
|
|
75
|
+
:height="150"
|
|
76
|
+
/>
|
|
77
|
+
</template>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 禁用预览
|
|
81
|
+
|
|
82
|
+
将 `preview` 设为 `false` 可禁用点击预览功能,此时图片不显示 `zoom-in` 光标:
|
|
83
|
+
|
|
84
|
+
```vue
|
|
85
|
+
<template>
|
|
86
|
+
<AiImage
|
|
87
|
+
src="https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=400&h=300&fit=crop"
|
|
88
|
+
:width="200"
|
|
89
|
+
:height="150"
|
|
90
|
+
:preview="false"
|
|
91
|
+
/>
|
|
92
|
+
</template>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## 预览属性配置
|
|
96
|
+
|
|
97
|
+
通过 `previewProps` 可为预览弹窗配置不同的图片源(如高清原图)、名称、尺寸信息等:
|
|
98
|
+
|
|
99
|
+
```vue
|
|
100
|
+
<template>
|
|
101
|
+
<AiImage
|
|
102
|
+
src="https://images.unsplash.com/photo-1447752875215-b2761acb3c5d?w=400&h=300&fit=crop"
|
|
103
|
+
:width="200"
|
|
104
|
+
:height="150"
|
|
105
|
+
:preview-props="{
|
|
106
|
+
src: 'https://images.unsplash.com/photo-1447752875215-b2761acb3c5d?w=1920',
|
|
107
|
+
name: '森林.jpg',
|
|
108
|
+
width: 1920,
|
|
109
|
+
resolution: '1920×1080',
|
|
110
|
+
}"
|
|
111
|
+
:show-info="true"
|
|
112
|
+
/>
|
|
113
|
+
</template>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 多图预览(配合 ImagePreviewGroup)
|
|
117
|
+
|
|
118
|
+
将多个 `AiImage` 放在 `ImagePreviewGroup` 中,点击任意图片会打开多图预览模式,支持左右切换:
|
|
119
|
+
|
|
120
|
+
```vue
|
|
121
|
+
<template>
|
|
122
|
+
<ImagePreviewGroup>
|
|
123
|
+
<AiImage
|
|
124
|
+
v-for="(src, i) in images"
|
|
125
|
+
:key="i"
|
|
126
|
+
:src="src"
|
|
127
|
+
:width="160"
|
|
128
|
+
:height="120"
|
|
129
|
+
/>
|
|
130
|
+
</ImagePreviewGroup>
|
|
131
|
+
</template>
|
|
132
|
+
|
|
133
|
+
<script setup lang="ts">
|
|
134
|
+
import { AiImage, ImagePreviewGroup } from '@blueking/chat-x';
|
|
135
|
+
|
|
136
|
+
const images = [
|
|
137
|
+
'https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=400&h=300&fit=crop',
|
|
138
|
+
'https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=400&h=300&fit=crop',
|
|
139
|
+
'https://images.unsplash.com/photo-1447752875215-b2761acb3c5d?w=400&h=300&fit=crop',
|
|
140
|
+
];
|
|
141
|
+
</script>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## 自定义下载
|
|
145
|
+
|
|
146
|
+
通过 `onDownload` 自定义下载行为(例如调用后端接口),不传时使用默认的 `<a>` 标签下载:
|
|
147
|
+
|
|
148
|
+
```vue
|
|
149
|
+
<template>
|
|
150
|
+
<AiImage
|
|
151
|
+
src="https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=400&h=300&fit=crop"
|
|
152
|
+
:width="200"
|
|
153
|
+
:height="150"
|
|
154
|
+
:on-download="handleDownload"
|
|
155
|
+
/>
|
|
156
|
+
</template>
|
|
157
|
+
|
|
158
|
+
<script setup lang="ts">
|
|
159
|
+
import { AiImage } from '@blueking/chat-x';
|
|
160
|
+
|
|
161
|
+
const handleDownload = (url: string) => {
|
|
162
|
+
console.log('自定义下载:', url);
|
|
163
|
+
};
|
|
164
|
+
</script>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## API
|
|
168
|
+
|
|
169
|
+
### Props
|
|
170
|
+
|
|
171
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
172
|
+
| ------------ | ----------------------- | ------- | --------------------------------------------------------------- |
|
|
173
|
+
| src | `string` | — | **必填**,图片地址 |
|
|
174
|
+
| alt | `string` | `''` | 图片 alt 属性 |
|
|
175
|
+
| width | `number \| string` | — | 容器宽度,数字时单位为 px |
|
|
176
|
+
| height | `number \| string` | — | 容器高度,数字时单位为 px |
|
|
177
|
+
| lazy | `boolean` | `false` | 是否懒加载(IntersectionObserver,rootMargin: 200px) |
|
|
178
|
+
| preview | `boolean` | `true` | 是否启用点击预览;为 `true` 且图片加载成功时显示 `zoom-in` 光标 |
|
|
179
|
+
| previewProps | `ImagePreviewConfig` | — | 预览弹窗配置(可指定高清源、名称、尺寸等) |
|
|
180
|
+
| showInfo | `boolean` | `false` | 预览工具栏是否显示图片尺寸信息 |
|
|
181
|
+
| onDownload | `(url: string) => void` | — | 自定义下载回调;不传时使用默认 `<a>` 标签下载 |
|
|
182
|
+
|
|
183
|
+
### Events
|
|
184
|
+
|
|
185
|
+
| 事件名 | 参数 | 说明 |
|
|
186
|
+
| ------- | ------------- | ------------------ |
|
|
187
|
+
| load | `(ev: Event)` | 图片加载成功时触发 |
|
|
188
|
+
| error | `(ev: Event)` | 图片加载失败时触发 |
|
|
189
|
+
| preview | — | 点击触发预览时触发 |
|
|
190
|
+
|
|
191
|
+
### Slots
|
|
192
|
+
|
|
193
|
+
| 插槽名 | 说明 |
|
|
194
|
+
| ------- | ----------------------------------------------- |
|
|
195
|
+
| default | 覆盖在图片上方的自定义内容 |
|
|
196
|
+
| extra | 预览工具栏的额外操作区域(透传给 ImagePreview) |
|
|
197
|
+
|
|
198
|
+
### Expose
|
|
199
|
+
|
|
200
|
+
| 属性名 | 类型 | 说明 |
|
|
201
|
+
| -------------- | -------------- | -------------------------------- |
|
|
202
|
+
| previewVisible | `Ref<boolean>` | 当前预览弹窗是否可见(独立模式) |
|
|
203
|
+
|
|
204
|
+
## 类型定义
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
interface ImagePreviewConfig {
|
|
208
|
+
src?: string;
|
|
209
|
+
name?: string;
|
|
210
|
+
width?: number;
|
|
211
|
+
height?: number;
|
|
212
|
+
resolution?: string;
|
|
213
|
+
downloadUrl?: string;
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## 使用场景
|
|
218
|
+
|
|
219
|
+
- AI 对话中的图片消息展示
|
|
220
|
+
- 需要点击放大查看的缩略图
|
|
221
|
+
- 多图浏览场景(配合 `ImagePreviewGroup`)
|
|
222
|
+
- 懒加载长列表中的图片
|
|
223
|
+
|
|
224
|
+
## 关联组件
|
|
225
|
+
|
|
226
|
+
- [ImagePreview](../molecular/image-preview.md) — 独立模式下的全屏预览
|
|
227
|
+
- [ImagePreviewGroup](../molecular/image-preview-group.md) — 多图注册与预览上下文
|