@blueking/chat-x 0.0.50 → 0.0.51-beta.2
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/ag-ui/types/contents.d.ts +2 -0
- package/dist/ag-ui/types/messages.d.ts +5 -0
- package/dist/common/constants.d.ts +1 -1
- package/dist/components/ai-buttons/file-upload-btn/file-upload-btn.vue.d.ts +0 -2
- package/dist/components/chat-content/file-content/file-content.vue.d.ts +5 -2
- package/dist/components/chat-content/file-content/upload-file-item.vue.d.ts +12 -0
- package/dist/components/chat-content/file-content/upload-image-item.vue.d.ts +21 -0
- package/dist/components/chat-input/ai-slash-editor/ai-slash-editor.vue.d.ts +1 -1
- package/dist/components/chat-input/build-default-placeholder.d.ts +7 -0
- package/dist/components/chat-input/chat-input.vue.d.ts +1 -1
- package/dist/components/chat-message/message-container/message-container.vue.d.ts +1 -0
- package/dist/components/chat-message/message-render/message-render.vue.d.ts +2 -0
- package/dist/components/chat-message/user-message/user-message.vue.d.ts +3 -1
- package/dist/components/index.d.ts +2 -1
- package/dist/components/message-tools/message-time/format-message-time.d.ts +8 -0
- package/dist/components/message-tools/message-time/message-time.vue.d.ts +8 -0
- package/dist/components/message-tools/message-tools.vue.d.ts +11 -1
- package/dist/composables/use-custom-tab.d.ts +5 -3
- package/dist/composables/use-global-config.d.ts +3 -0
- package/dist/composables/use-message-group.d.ts +150 -72
- package/dist/icons/execution.d.ts +6 -0
- package/dist/icons/tools.d.ts +3 -0
- package/dist/index.css +1 -1
- package/dist/index.js +3124 -2837
- package/dist/index.js.map +1 -1
- package/dist/lang/lang.d.ts +8 -7
- package/dist/mcp/generated/docs/ai-slash-input.md +2 -0
- package/dist/mcp/generated/docs/assistant-message.md +9 -7
- package/dist/mcp/generated/docs/chat-container.md +38 -32
- package/dist/mcp/generated/docs/chat-input.md +18 -12
- package/dist/mcp/generated/docs/cite-content.md +3 -3
- package/dist/mcp/generated/docs/desc-panel.md +32 -10
- package/dist/mcp/generated/docs/execution-summary.md +3 -3
- package/dist/mcp/generated/docs/file-artifact-panel.md +6 -4
- package/dist/mcp/generated/docs/file-content.md +89 -73
- package/dist/mcp/generated/docs/file-upload-btn.md +16 -18
- package/dist/mcp/generated/docs/message-container.md +3 -0
- package/dist/mcp/generated/docs/message-render.md +2 -1
- package/dist/mcp/generated/docs/message-time.md +180 -0
- package/dist/mcp/generated/docs/message-tools.md +47 -12
- package/dist/mcp/generated/docs/messages.md +9 -0
- package/dist/mcp/generated/docs/toolcall-render.md +82 -43
- package/dist/mcp/generated/docs/use-artifact-preview.md +19 -17
- package/dist/mcp/generated/docs/use-custom-tab.md +12 -8
- package/dist/mcp/generated/docs/use-global-config.md +15 -5
- package/dist/mcp/generated/docs/user-message.md +9 -0
- package/dist/mcp/generated/docs/user-question-card.md +2 -0
- package/dist/mcp/generated/index.json +46 -6
- package/dist/types/input.d.ts +6 -0
- package/dist/utils/file.d.ts +7 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/merge-tools-by-id.d.ts +6 -0
- package/dist/utils/upload-file.d.ts +35 -0
- package/package.json +3 -2
- package/skills/blueking-chat-x/SKILL.md +139 -0
- package/skills/blueking-chat-x/references/_index.md +131 -0
- package/skills/blueking-chat-x/references/components/activity-layout.md +134 -0
- package/skills/blueking-chat-x/references/components/activity-message.md +486 -0
- package/skills/blueking-chat-x/references/components/ai-image.md +230 -0
- package/skills/blueking-chat-x/references/components/ai-loading.md +131 -0
- package/skills/blueking-chat-x/references/components/ai-prompt-list.md +44 -0
- package/skills/blueking-chat-x/references/components/ai-selection.md +439 -0
- package/skills/blueking-chat-x/references/components/ai-skill-list.md +73 -0
- package/skills/blueking-chat-x/references/components/ai-slash-editor.md +43 -0
- package/skills/blueking-chat-x/references/components/ai-slash-input.md +56 -0
- package/skills/blueking-chat-x/references/components/ai-slash-menu.md +42 -0
- package/skills/blueking-chat-x/references/components/animation-text.md +202 -0
- package/skills/blueking-chat-x/references/components/assistant-message.md +498 -0
- package/skills/blueking-chat-x/references/components/chat-container.md +869 -0
- package/skills/blueking-chat-x/references/components/chat-input.md +769 -0
- package/skills/blueking-chat-x/references/components/cite-content.md +142 -0
- package/skills/blueking-chat-x/references/components/code-content.md +211 -0
- package/skills/blueking-chat-x/references/components/common-error-content.md +73 -0
- package/skills/blueking-chat-x/references/components/content-render.md +233 -0
- package/skills/blueking-chat-x/references/components/delete-tool.md +191 -0
- package/skills/blueking-chat-x/references/components/desc-panel.md +162 -0
- package/skills/blueking-chat-x/references/components/detail-section.md +91 -0
- package/skills/blueking-chat-x/references/components/execution-summary.md +128 -0
- package/skills/blueking-chat-x/references/components/file-artifact-panel.md +289 -0
- package/skills/blueking-chat-x/references/components/file-content.md +319 -0
- package/skills/blueking-chat-x/references/components/file-icon.md +109 -0
- package/skills/blueking-chat-x/references/components/file-upload-btn.md +159 -0
- package/skills/blueking-chat-x/references/components/flow-agent-content.md +264 -0
- package/skills/blueking-chat-x/references/components/flow-agent-node-detail.md +236 -0
- package/skills/blueking-chat-x/references/components/highlight-keyword.md +146 -0
- package/skills/blueking-chat-x/references/components/image-content.md +182 -0
- package/skills/blueking-chat-x/references/components/image-preview-group.md +184 -0
- package/skills/blueking-chat-x/references/components/image-preview.md +226 -0
- package/skills/blueking-chat-x/references/components/info-message.md +144 -0
- package/skills/blueking-chat-x/references/components/input-attachment.md +49 -0
- package/skills/blueking-chat-x/references/components/input-info-alert.md +42 -0
- package/skills/blueking-chat-x/references/components/interrupt-message.md +212 -0
- package/skills/blueking-chat-x/references/components/key-value-content.md +128 -0
- package/skills/blueking-chat-x/references/components/knowledge-rag-content.md +122 -0
- package/skills/blueking-chat-x/references/components/latex-content.md +200 -0
- package/skills/blueking-chat-x/references/components/loading-message.md +192 -0
- package/skills/blueking-chat-x/references/components/markdown-content.md +232 -0
- package/skills/blueking-chat-x/references/components/mermaid-content.md +189 -0
- package/skills/blueking-chat-x/references/components/message-container.md +645 -0
- package/skills/blueking-chat-x/references/components/message-loading.md +118 -0
- package/skills/blueking-chat-x/references/components/message-render.md +327 -0
- package/skills/blueking-chat-x/references/components/message-time.md +177 -0
- package/skills/blueking-chat-x/references/components/message-tools.md +416 -0
- package/skills/blueking-chat-x/references/components/model-selector.md +155 -0
- package/skills/blueking-chat-x/references/components/preview-toolbar.md +42 -0
- package/skills/blueking-chat-x/references/components/questions-container.md +85 -0
- package/skills/blueking-chat-x/references/components/reasoning-message.md +232 -0
- package/skills/blueking-chat-x/references/components/reference-content.md +135 -0
- package/skills/blueking-chat-x/references/components/reference-doc-content.md +109 -0
- package/skills/blueking-chat-x/references/components/scroll-btn.md +159 -0
- package/skills/blueking-chat-x/references/components/selection-footer.md +78 -0
- package/skills/blueking-chat-x/references/components/selection-question.md +88 -0
- package/skills/blueking-chat-x/references/components/shortcut-btn.md +204 -0
- package/skills/blueking-chat-x/references/components/shortcut-btns.md +266 -0
- package/skills/blueking-chat-x/references/components/shortcut-render.md +424 -0
- package/skills/blueking-chat-x/references/components/simple-table.md +101 -0
- package/skills/blueking-chat-x/references/components/text-content.md +77 -0
- package/skills/blueking-chat-x/references/components/tool-approval-card.md +183 -0
- package/skills/blueking-chat-x/references/components/tool-btn.md +317 -0
- package/skills/blueking-chat-x/references/components/tool-message.md +235 -0
- package/skills/blueking-chat-x/references/components/toolcall-render.md +348 -0
- package/skills/blueking-chat-x/references/components/user-feedback.md +233 -0
- package/skills/blueking-chat-x/references/components/user-message.md +424 -0
- package/skills/blueking-chat-x/references/components/user-question-answered-card.md +104 -0
- package/skills/blueking-chat-x/references/components/user-question-card.md +231 -0
- package/skills/blueking-chat-x/references/components/user-question-choice.md +105 -0
- package/skills/blueking-chat-x/references/components/user-question-option.md +42 -0
- package/skills/blueking-chat-x/references/components/vnode-renderer.md +122 -0
- package/skills/blueking-chat-x/references/composables/use-animation-text.md +196 -0
- package/skills/blueking-chat-x/references/composables/use-artifact-preview.md +231 -0
- package/skills/blueking-chat-x/references/composables/use-clipboard.md +203 -0
- package/skills/blueking-chat-x/references/composables/use-command-selection.md +150 -0
- package/skills/blueking-chat-x/references/composables/use-container-scroll.md +57 -0
- package/skills/blueking-chat-x/references/composables/use-custom-tab.md +158 -0
- package/skills/blueking-chat-x/references/composables/use-flow-node-actions.md +157 -0
- package/skills/blueking-chat-x/references/composables/use-full-screen.md +112 -0
- package/skills/blueking-chat-x/references/composables/use-global-config.md +148 -0
- package/skills/blueking-chat-x/references/composables/use-menu-keydown.md +163 -0
- package/skills/blueking-chat-x/references/composables/use-message-group.md +247 -0
- package/skills/blueking-chat-x/references/composables/use-observer-visible-list.md +188 -0
- package/skills/blueking-chat-x/references/composables/use-parent-scrolling.md +46 -0
- package/skills/blueking-chat-x/references/theme/theme.md +431 -0
- package/skills/blueking-chat-x/references/types/constants.md +307 -0
- package/skills/blueking-chat-x/references/types/interrupt.md +379 -0
- package/skills/blueking-chat-x/references/types/messages.md +553 -0
- package/skills/blueking-chat-x/references/types/schema.md +91 -0
- package/skills/blueking-chat-x/scripts/generate-references.mjs +314 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# CiteContent 引用内容
|
|
2
|
+
|
|
3
|
+
> 能力域:内容渲染 | 导入:`import { CiteContent } from '@blueking/chat-x'` | since 1.0.0
|
|
4
|
+
|
|
5
|
+
渲染输入或消息中的引用片段。 源码位置:src/components/chat-content/cite-content/cite-content.vue。
|
|
6
|
+
|
|
7
|
+
**关联**:chat-input(输入区展示待发送引用内容)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# CiteContent 引用内容
|
|
12
|
+
## 源码事实
|
|
13
|
+
|
|
14
|
+
- **源码位置**:`src/components/chat-content/cite-content/cite-content.vue`
|
|
15
|
+
- **能力域**:内容渲染
|
|
16
|
+
- **能力说明**:渲染输入或消息中的引用片段。
|
|
17
|
+
|
|
18
|
+
> **能力域**:内容渲染
|
|
19
|
+
|
|
20
|
+
展示被引用文本片段的紧凑条带组件。固定高度 28px,左侧引用图标 + 单行截断文本 + 可选关闭图标,背景灰色(`#f5f7fa`),hover 背景为 `#eaebf0`。
|
|
21
|
+
|
|
22
|
+
常见于两处:
|
|
23
|
+
|
|
24
|
+
- **`UserMessage`**:`property.extra.cite` 为字符串时,渲染在消息气泡上方
|
|
25
|
+
- **`ChatInput`**:通过 `v-model:cite` 绑定,渲染在输入框顶部,关闭后清空引用
|
|
26
|
+
|
|
27
|
+
## 组件结构
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
.ai-cite-content(flex,height: 28px,padding: 0 8px,gap: 4px,bg: #f5f7fa,hover: #eaebf0,border-radius: 4px,margin-bottom: 4px)
|
|
31
|
+
├── CiteIcon(14×14px,color: #979ba5,始终显示)
|
|
32
|
+
├── .ai-cite-content-text(flex: 1,单行截断,color: #979ba5,overflow: hidden,text-overflow: ellipsis)
|
|
33
|
+
│ {{ content }}(Vue 文本插值,XSS 安全)
|
|
34
|
+
└── CloseIcon(14×14px,color: #979ba5,v-if="onClose",hover: #4d4f56)
|
|
35
|
+
@click → onClose(content)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 基础用法
|
|
39
|
+
|
|
40
|
+
```vue
|
|
41
|
+
<template>
|
|
42
|
+
<CiteContent content="这是一段被引用的文本" />
|
|
43
|
+
</template>
|
|
44
|
+
|
|
45
|
+
<script setup lang="ts">
|
|
46
|
+
import { CiteContent } from '@blueking/chat-x';
|
|
47
|
+
</script>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 可关闭引用
|
|
51
|
+
|
|
52
|
+
传入 `onClose` 函数后,右侧显示关闭图标;点击时将当前 `content` 作为参数回传给 `onClose`:
|
|
53
|
+
|
|
54
|
+
```vue
|
|
55
|
+
<template>
|
|
56
|
+
<CiteContent
|
|
57
|
+
v-if="showCite"
|
|
58
|
+
content="这是一段可关闭的引用文本"
|
|
59
|
+
:on-close="handleClose"
|
|
60
|
+
/>
|
|
61
|
+
</template>
|
|
62
|
+
|
|
63
|
+
<script setup lang="ts">
|
|
64
|
+
import { CiteContent } from '@blueking/chat-x';
|
|
65
|
+
|
|
66
|
+
const handleClose = (content: string) => {
|
|
67
|
+
// content 即当前引用文本,可用于日志或状态清除
|
|
68
|
+
console.log('关闭引用:', content);
|
|
69
|
+
};
|
|
70
|
+
</script>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## 长文本截断
|
|
74
|
+
|
|
75
|
+
文本超出容器宽度时自动单行截断(`text-overflow: ellipsis`),始终保持 28px 高度不变形:
|
|
76
|
+
|
|
77
|
+
## 与 ChatInput 配合
|
|
78
|
+
|
|
79
|
+
`ChatInput` 通过 `v-model:cite` 内置了 `CiteContent`,当 `cite` 有值时自动渲染在输入框顶部(`input-header` slot 位置);用户点击关闭时,内部调用 `citeModel.value = ''` 清空引用:
|
|
80
|
+
|
|
81
|
+
```vue
|
|
82
|
+
<template>
|
|
83
|
+
<ChatInput
|
|
84
|
+
v-model="inputValue"
|
|
85
|
+
v-model:cite="citeText"
|
|
86
|
+
/>
|
|
87
|
+
</template>
|
|
88
|
+
|
|
89
|
+
<script setup lang="ts">
|
|
90
|
+
import { ref } from 'vue';
|
|
91
|
+
import { ChatInput } from '@blueking/chat-x';
|
|
92
|
+
|
|
93
|
+
const inputValue = ref('');
|
|
94
|
+
const citeText = ref('');
|
|
95
|
+
|
|
96
|
+
// 用户通过 AiSelection 划词后,将选中文本赋值给 citeText
|
|
97
|
+
// ChatInput 会自动在顶部显示 CiteContent,用户点击关闭时 citeText 自动清空
|
|
98
|
+
function onUserSelectText(selectedText: string) {
|
|
99
|
+
citeText.value = selectedText;
|
|
100
|
+
}
|
|
101
|
+
</script>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 与 UserMessage 配合
|
|
105
|
+
|
|
106
|
+
`UserMessage` 在 `property.extra.cite` 为字符串时,自动在气泡上方渲染 `CiteContent`(不带关闭按钮):
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
const message = {
|
|
110
|
+
role: 'user',
|
|
111
|
+
content: '这段代码有什么性能问题?',
|
|
112
|
+
property: {
|
|
113
|
+
extra: {
|
|
114
|
+
// 字符串类型 → 渲染 CiteContent(气泡外上方)
|
|
115
|
+
cite: 'for (let i = 0; i < arr.length; i++) {\n fetch(`/api/${arr[i]}`)\n}',
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## API
|
|
122
|
+
|
|
123
|
+
### Props
|
|
124
|
+
|
|
125
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
126
|
+
| ------- | --------------------------- | ---- | --------------------------------------------------------- |
|
|
127
|
+
| content | `string` | ✓ | 引用的文本内容;使用 Vue 文本插值渲染,XSS 安全 |
|
|
128
|
+
| onClose | `(content: string) => void` | — | 关闭回调;传入后右侧显示关闭图标,点击时将 `content` 回传 |
|
|
129
|
+
|
|
130
|
+
> **XSS 安全**:`content` 通过 `{{ content }}` 文本插值渲染,不会执行 HTML 标签或脚本。
|
|
131
|
+
|
|
132
|
+
## 样式说明
|
|
133
|
+
|
|
134
|
+
| 元素 | 关键样式 |
|
|
135
|
+
| ------------------------ | --------------------------------------------------------------------------------------------------- |
|
|
136
|
+
| `.ai-cite-content` | `height: 28px`,`padding: 0 8px`,`background: #f5f7fa`,hover `#eaebf0`,`margin-bottom: 4px`(为下方内容留出间距) |
|
|
137
|
+
| `.ai-cite-content-text` | `flex: 1`,`white-space: nowrap`,`overflow: hidden`,`text-overflow: ellipsis`,`color: #979ba5` |
|
|
138
|
+
| `CiteIcon` / `CloseIcon` | `14×14px`,`color: #979ba5`;CloseIcon hover 变为 `#4d4f56` |
|
|
139
|
+
|
|
140
|
+
## 关联组件
|
|
141
|
+
|
|
142
|
+
- [ChatInput](/components/input/chat-input) — 引用区常见挂载位置
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# CodeContent 代码块
|
|
2
|
+
|
|
3
|
+
> 能力域:内容渲染 | 导入:`import { CodeContent } from '@blueking/chat-x'` | since 1.0.0
|
|
4
|
+
|
|
5
|
+
渲染 Markdown 代码块,支持高亮、复制和 header 插槽。 源码位置:src/components/markdown-token/code-content/code-content.vue。
|
|
6
|
+
|
|
7
|
+
**关联**:markdown-content(解析 Markdown 后生成 fence token 并渲染本组件)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# CodeContent 代码块渲染
|
|
12
|
+
## 源码事实
|
|
13
|
+
|
|
14
|
+
- **源码位置**:`src/components/markdown-token/code-content/code-content.vue`
|
|
15
|
+
- **能力域**:内容渲染
|
|
16
|
+
- **能力说明**:渲染 Markdown 代码块,支持高亮、复制和 header 插槽。
|
|
17
|
+
|
|
18
|
+
> **能力域**:内容渲染
|
|
19
|
+
|
|
20
|
+
代码块渲染基础组件,专为 **Markdown 流式输出**设计。接收 `markdown-it` token 数组,基于 `highlight.js`(github-dark 主题)实现逐行语法高亮,顶部固定深色头部展示语言名和复制按钮。
|
|
21
|
+
|
|
22
|
+
## 组件结构
|
|
23
|
+
|
|
24
|
+
根类名为 **`.ai-code-content-wrapper`**:外层宽度、下边距以及 **`.code-content-header`**(深色顶栏)在任意父级下均生效。**代码区** `.hljs-pre`、行内高亮等样式选择器为 **`.ai-message-container .ai-code-content-wrapper`**,仅在消息列表(`MessageContainer` 根上的 `ai-message-container`)内与对话区一致。Wiki 与业务中若要完整还原代码区外观,请将 `CodeContent` 包在带 `ai-message-container` 类名的父节点内。
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
.ai-code-content-wrapper
|
|
28
|
+
├── .code-content-header(深色顶栏;不依赖 .ai-message-container)
|
|
29
|
+
│ ├── .code-header-language(token.info)
|
|
30
|
+
│ ├── slot#header({ language, token })
|
|
31
|
+
│ └── ToolBtn id="copy"
|
|
32
|
+
│
|
|
33
|
+
└── .hljs-pre(完整 padding / 背景 / code 字体:需父级为 .ai-message-container .ai-code-content-wrapper)
|
|
34
|
+
└── <code class="hljs language-{raw-info}">
|
|
35
|
+
├── v-for completedLines → <span class="code-line" />
|
|
36
|
+
└── v-if currentLineText → <span class="code-line current-line" />
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 基础用法
|
|
40
|
+
|
|
41
|
+
`token` 接收 `markdown-it` 解析生成的 token 数组,组件从中提取第一个 `fence` 或 `code_block` token 渲染:
|
|
42
|
+
|
|
43
|
+
```vue
|
|
44
|
+
<template>
|
|
45
|
+
<!-- 代码区 .hljs-pre 的完整样式依赖父级 .ai-message-container(与对话消息区一致);顶栏单独也可用 -->
|
|
46
|
+
<div class="ai-message-container">
|
|
47
|
+
<CodeContent
|
|
48
|
+
:token="codeTokens"
|
|
49
|
+
@mounted="handleMounted"
|
|
50
|
+
/>
|
|
51
|
+
</div>
|
|
52
|
+
</template>
|
|
53
|
+
|
|
54
|
+
<script setup lang="ts">
|
|
55
|
+
import { CodeContent } from '@blueking/chat-x';
|
|
56
|
+
import type { Token } from 'markdown-it';
|
|
57
|
+
|
|
58
|
+
const codeTokens: Token[] = [
|
|
59
|
+
{
|
|
60
|
+
type: 'fence',
|
|
61
|
+
tag: 'code',
|
|
62
|
+
info: 'typescript',
|
|
63
|
+
content: 'const greeting = "Hello, World!";\nconsole.log(greeting);',
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
const handleMounted = ({ el }: { el: HTMLElement | null }) => {
|
|
68
|
+
// el 是 <code> 元素的 DOM 引用(通过懒加载 getter 访问)
|
|
69
|
+
console.log('代码块已渲染:', el);
|
|
70
|
+
};
|
|
71
|
+
</script>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**TypeScript**
|
|
75
|
+
|
|
76
|
+
**Python**
|
|
77
|
+
|
|
78
|
+
**SQL**
|
|
79
|
+
|
|
80
|
+
## 流式渲染
|
|
81
|
+
|
|
82
|
+
组件的核心设计场景。流式输入时,每次 `token[].content` 追加新内容,只更新最后一行,已完成的行通过**内容比较复用缓存**,无需重新高亮:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
content 变化 → watch(immediate: true, deep: true) → processContent()
|
|
86
|
+
→ split('\n')
|
|
87
|
+
→ 除最后一行:与 completedLines 对比,内容未变则复用,否则重新 highlightLine
|
|
88
|
+
→ 最后一行:highlightLine 并赋值给 currentLineHtml(v-html 渲染)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**注意**:当 content 以 `\n` 结尾时,`split('\n')` 末尾为 `''`,`currentLineText = ''`,`.current-line` 元素不渲染(`v-if="currentLineText"`)。
|
|
92
|
+
|
|
93
|
+
```vue
|
|
94
|
+
<script setup lang="ts">
|
|
95
|
+
import { ref } from 'vue';
|
|
96
|
+
import { CodeContent } from '@blueking/chat-x';
|
|
97
|
+
|
|
98
|
+
const streamingTokens = ref([{ type: 'fence', tag: 'code', info: 'typescript', content: '' }]);
|
|
99
|
+
|
|
100
|
+
async function simulateStream() {
|
|
101
|
+
let content = '';
|
|
102
|
+
for (const char of fullCode) {
|
|
103
|
+
await new Promise(r => setTimeout(r, 20));
|
|
104
|
+
content += char;
|
|
105
|
+
// 每次只更新 content,token 数组引用可保持同一个对象(deep watch)
|
|
106
|
+
streamingTokens.value = [{ type: 'fence', tag: 'code', info: 'typescript', content }];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
</script>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## 语言识别
|
|
113
|
+
|
|
114
|
+
### 内置别名映射
|
|
115
|
+
|
|
116
|
+
组件在 `MarkdownLanguageMap` 中维护了 3 个常用别名,`info` 字段使用别名时自动映射:
|
|
117
|
+
|
|
118
|
+
| `info` 值 | 映射后 | 说明 |
|
|
119
|
+
| --------- | ------------ | ---- |
|
|
120
|
+
| `js` | `javascript` | — |
|
|
121
|
+
| `ts` | `typescript` | — |
|
|
122
|
+
| `py` | `python` | — |
|
|
123
|
+
|
|
124
|
+
### 解析优先级
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
1. MarkdownLanguageMap[info] → 尝试别名映射
|
|
128
|
+
2. hljs.getLanguage(mappedLang) → 检查 hljs 是否支持
|
|
129
|
+
3. 提取文件扩展名(如 "index.ts" → "ts")→ 再次查询 hljs
|
|
130
|
+
4. 均不匹配 → resolveLanguage 返回 null → 对内容进行 HTML 转义(非高亮)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
> **注意**:`code` 元素的 class 使用原始 `token.info`(`language-{info}`),不是解析后的语言名。即 `info: 'js'` → `class="language-js"`,但高亮时用 `javascript`。
|
|
134
|
+
|
|
135
|
+
### 未知语言(HTML 转义)
|
|
136
|
+
|
|
137
|
+
当语言无法识别时,内容经过 HTML 转义(`<` `>` `&` `"`)后直接渲染,不进行语法高亮:
|
|
138
|
+
|
|
139
|
+
### 无语言标识
|
|
140
|
+
|
|
141
|
+
`info` 为空字符串时,语言区域留空,内容同样走 HTML 转义路径:
|
|
142
|
+
|
|
143
|
+
## 高亮缓存
|
|
144
|
+
|
|
145
|
+
每行代码的高亮结果缓存在组件实例内部的 `Map<string, string>` 中(key 为 `"${lang}:${lineContent}"`),最大容量 500 条;超限后清除前 250 条(LRU 近似):
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
const lineHighlightCache = new Map<string, string>();
|
|
149
|
+
const MAX_CACHE_SIZE = 500;
|
|
150
|
+
|
|
151
|
+
// 超限时清理前半部分
|
|
152
|
+
if (lineHighlightCache.size > MAX_CACHE_SIZE) {
|
|
153
|
+
const keys = Array.from(lineHighlightCache.keys()).slice(0, MAX_CACHE_SIZE / 2);
|
|
154
|
+
keys.forEach(k => lineHighlightCache.delete(k));
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## API
|
|
159
|
+
|
|
160
|
+
### Props
|
|
161
|
+
|
|
162
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
163
|
+
| ------ | --------- | ---- | ------------------------------------------------------------------------ |
|
|
164
|
+
| token | `Token[]` | ✓ | markdown-it token 数组;组件提取其中第一个 `fence` 或 `code_block` token |
|
|
165
|
+
|
|
166
|
+
### Events
|
|
167
|
+
|
|
168
|
+
| 事件名 | 参数类型 | 触发时机 |
|
|
169
|
+
| ------- | ----------------------------- | --------------------------------------------------------------------------------- |
|
|
170
|
+
| mounted | `{ el: HTMLElement \| null }` | 每次 `token` 变化后 `nextTick` 完成时;`el` 为 `<code>` 元素引用(懒加载 getter) |
|
|
171
|
+
|
|
172
|
+
### Slots
|
|
173
|
+
|
|
174
|
+
| 插槽名 | 参数 | 说明 |
|
|
175
|
+
| ------ | -------------------------------------- | ------------------------------------------------------------------------------------------ |
|
|
176
|
+
| header | `{ language: string; token: Token[] }` | 代码块头部自定义内容区域,渲染在语言标签和复制按钮之间,可用于添加"插入"、"应用"等操作按钮 |
|
|
177
|
+
|
|
178
|
+
> **`mounted` 频率**:由于 `watch` 设置了 `immediate: true` 和 `deep: true`,每次 `token` 内容变化(包括初始化)都会触发 `mounted` 事件。
|
|
179
|
+
|
|
180
|
+
## Token 结构
|
|
181
|
+
|
|
182
|
+
组件从 token 数组中提取第一个匹配的 token:
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
// 组件接受的 token 格式(只使用这 3 个字段)
|
|
186
|
+
interface CodeToken {
|
|
187
|
+
type: 'fence' | 'code_block'; // 触发提取的条件
|
|
188
|
+
info: string; // 语言标识(如 'typescript'),显示在头部
|
|
189
|
+
content: string; // 代码内容(换行符 '\n' 分隔多行)
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
完整 Token 类型从 `markdown-it` 包引入:
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
import type { Token } from 'markdown-it';
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## 样式说明
|
|
200
|
+
|
|
201
|
+
| 区域 | 关键样式 |
|
|
202
|
+
| ----------------------- | ------------------------------------------------------------------------------------ |
|
|
203
|
+
| `.code-content-header` | `height: 40px`,`background: #2f333d`,`border: 1px solid #1a1a1a`,圆角仅顶部 `6px` |
|
|
204
|
+
| `.code-header-language` | `color: #999`,`font-size: 12px`,`margin-right: auto`(推复制按钮到右侧) |
|
|
205
|
+
| `.hljs-pre` | `background: #282c34`,`padding: 8px 16px`,`overflow-x: auto`,圆角仅底部 `6px` |
|
|
206
|
+
| `code` | `color: #abb2bf`,`font-size: 13px`,`line-height: 1.5`,等宽字体栈 |
|
|
207
|
+
| `.code-line` | `display: inline`(保持行内流式拼接) |
|
|
208
|
+
|
|
209
|
+
## 关联组件
|
|
210
|
+
|
|
211
|
+
- [MarkdownContent](/components/rendering/markdown-content) — 解析并传入 code fence token
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# CommonErrorContent 错误内容
|
|
2
|
+
|
|
3
|
+
> 能力域:内容渲染 | 导入:`import { CommonErrorContent } from '@blueking/chat-x'` | since 1.0.0
|
|
4
|
+
|
|
5
|
+
展示统一错误提示内容。 源码位置:src/components/chat-content/common-error-content/common-error-content.vue。
|
|
6
|
+
|
|
7
|
+
**关联**:markdown-content(Markdown 渲染错误态展示)、reasoning-message(推理消息错误态展示)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# CommonErrorContent 通用错误内容
|
|
12
|
+
## 源码事实
|
|
13
|
+
|
|
14
|
+
- **源码位置**:`src/components/chat-content/common-error-content/common-error-content.vue`
|
|
15
|
+
- **能力域**:内容渲染
|
|
16
|
+
- **能力说明**:展示统一错误提示内容。
|
|
17
|
+
|
|
18
|
+
> **能力域**:内容渲染
|
|
19
|
+
|
|
20
|
+
错误状态消息渲染基础组件。红色 `ErrorIcon`(14×14px,绝对定位)+ 文本区域,`display: flex` 水平排列。
|
|
21
|
+
|
|
22
|
+
通常由上层组件在 `status === 'error'` 时自动渲染,无需手动使用。
|
|
23
|
+
|
|
24
|
+
## 组件结构
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
.ai-error-content(position: relative,display: flex,align-items: center)
|
|
28
|
+
├── ErrorIcon(position: absolute,top: 2px,left: 0,flex: 0 0 14px,14×14px,color: #ea3636)
|
|
29
|
+
└── .ai-error-content-text(flex: 1,margin-left: 20px,font-size: 12px,line-height: 20px,color: #4d4f56)
|
|
30
|
+
└── {{ content }}(Vue 文本插值,XSS 安全;content 为 undefined 时渲染空文本)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 基础用法
|
|
34
|
+
|
|
35
|
+
```vue
|
|
36
|
+
<template>
|
|
37
|
+
<CommonErrorContent content="请求失败,请稍后重试" />
|
|
38
|
+
</template>
|
|
39
|
+
|
|
40
|
+
<script setup lang="ts">
|
|
41
|
+
import { CommonErrorContent } from '@blueking/chat-x';
|
|
42
|
+
</script>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 典型错误场景
|
|
46
|
+
|
|
47
|
+
## 不传 content
|
|
48
|
+
|
|
49
|
+
`content` 为可选,缺省时只渲染 `ErrorIcon`:
|
|
50
|
+
|
|
51
|
+
## 使用场景
|
|
52
|
+
|
|
53
|
+
组件库内部有两处自动使用:
|
|
54
|
+
|
|
55
|
+
| 使用方 | 触发条件 | 传入内容 |
|
|
56
|
+
| ------------------ | -------------------- | --------------------------------------------- |
|
|
57
|
+
| `MarkdownContent` | `status === 'error'` | `content`(字符串) |
|
|
58
|
+
| `ReasoningMessage` | `status === 'error'` | `content?.join('\n') \|\| ''`(数组转字符串) |
|
|
59
|
+
|
|
60
|
+
即 `AssistantMessage` / `ReasoningMessage` 在错误状态时,内容区域会自动替换为此组件,无需手动引入。
|
|
61
|
+
|
|
62
|
+
## API
|
|
63
|
+
|
|
64
|
+
### Props
|
|
65
|
+
|
|
66
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
67
|
+
| ------- | -------- | ---- | --------------------------------------------------------------- |
|
|
68
|
+
| content | `string` | — | 错误提示文本;使用 Vue 文本插值渲染,XSS 安全;缺省时仅显示图标 |
|
|
69
|
+
|
|
70
|
+
## 关联组件
|
|
71
|
+
|
|
72
|
+
- [MarkdownContent](/components/rendering/markdown-content) — Markdown 错误态
|
|
73
|
+
- [ReasoningMessage](/components/message/reasoning-message) — 推理错误态
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# ContentRender 内容渲染器
|
|
2
|
+
|
|
3
|
+
> 能力域:内容渲染 | 导入:`import { ContentRender } from '@blueking/chat-x'` | since 1.0.0
|
|
4
|
+
|
|
5
|
+
按 MessageContentType 分发 Markdown、文本、引用、键值、图片等内容。 源码位置:src/components/chat-content/content-render/content-render.vue。
|
|
6
|
+
|
|
7
|
+
**关联**:markdown-content(文本类 Markdown 正文的默认渲染实现)、reference-content(引用文档数组类型的列表渲染)、assistant-message(AI 回复中默认通过本组件渲染正文)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# ContentRender 内容渲染器
|
|
12
|
+
## 源码事实
|
|
13
|
+
|
|
14
|
+
- **源码位置**:`src/components/chat-content/content-render/content-render.vue`
|
|
15
|
+
- **能力域**:内容渲染
|
|
16
|
+
- **能力说明**:按 MessageContentType 分发 Markdown、文本、引用、键值、图片等内容。
|
|
17
|
+
|
|
18
|
+
> **能力域**:内容渲染
|
|
19
|
+
|
|
20
|
+
消息内容渲染分发组件,根据 `content` 的 JavaScript 类型自动选择渲染方式:字符串 → `MarkdownContent`(Markdown 渲染),数组 → `ReferenceContent`(引用列表)。
|
|
21
|
+
|
|
22
|
+
## 渲染管线
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
ContentRender
|
|
26
|
+
├── typeof content === 'string' → MarkdownContent(Markdown 渲染)
|
|
27
|
+
│ └── status === 'error' → CommonErrorContent(红色错误图标 + 文本)
|
|
28
|
+
├── Array.isArray(content) → ReferenceContent(引用文档列表)
|
|
29
|
+
└── 其他 → undefined(不渲染,可通过 slot 自定义)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
> **注意**:渲染类型由 `content` 的 JavaScript 类型决定(字符串 vs 数组),`type` prop 仅当传入 `MessageContentType.Text` 时才强制走 `MarkdownContent`,通常不需要显式传递。
|
|
33
|
+
|
|
34
|
+
## 基础用法(Markdown 文本)
|
|
35
|
+
|
|
36
|
+
字符串内容自动渲染为 Markdown:
|
|
37
|
+
|
|
38
|
+
```vue
|
|
39
|
+
<template>
|
|
40
|
+
<ContentRender
|
|
41
|
+
:content="content"
|
|
42
|
+
:status="status"
|
|
43
|
+
/>
|
|
44
|
+
</template>
|
|
45
|
+
|
|
46
|
+
<script setup lang="ts">
|
|
47
|
+
import { ContentRender, MessageStatus } from '@blueking/chat-x';
|
|
48
|
+
|
|
49
|
+
const content = '这是一段 **Markdown** 内容,支持 `代码`、**加粗**、*斜体* 等语法。';
|
|
50
|
+
const status = MessageStatus.Complete;
|
|
51
|
+
</script>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**渲染效果**
|
|
55
|
+
|
|
56
|
+
## Markdown 语法支持
|
|
57
|
+
|
|
58
|
+
`MarkdownContent` 内置了完整的 Markdown 解析能力,使用 `markdown-it` + 多个插件:
|
|
59
|
+
|
|
60
|
+
### 常用语法(代码、列表、表格)
|
|
61
|
+
|
|
62
|
+
### 扩展语法
|
|
63
|
+
|
|
64
|
+
| 语法 | 效果 | 插件 |
|
|
65
|
+
| --------------------- | -------------- | ------------------------- |
|
|
66
|
+
| `++文字++` | 下划线(新增) | markdown-it-ins |
|
|
67
|
+
| `==文字==` | 高亮标注 | markdown-it-mark |
|
|
68
|
+
| `^上标^` | 上标 | markdown-it-sup |
|
|
69
|
+
| `~下标~` | 下标 | markdown-it-sub |
|
|
70
|
+
| `[^1]` / `[^1]: 内容` | 脚注 | markdown-it-footnote |
|
|
71
|
+
| `- [x] 任务` | 任务列表 | markdown-it-task-checkbox |
|
|
72
|
+
|
|
73
|
+
### LaTeX 数学公式
|
|
74
|
+
|
|
75
|
+
行内公式 `$...$` 和块级公式 `$$...$$`,由 `katex` 渲染:
|
|
76
|
+
|
|
77
|
+
```vue
|
|
78
|
+
<ContentRender content="行内公式:$E = mc^2$" status="complete" />
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Mermaid 图表
|
|
82
|
+
|
|
83
|
+
代码块语言标识为 `mermaid` 时,由 `MermaidContent` 专门渲染:
|
|
84
|
+
|
|
85
|
+
## 消息状态
|
|
86
|
+
|
|
87
|
+
`status` 只传递给 `MarkdownContent`,对 `ReferenceContent` 无效。
|
|
88
|
+
|
|
89
|
+
| `status` | 渲染行为 |
|
|
90
|
+
| ----------- | ----------------------------------------------------------------- |
|
|
91
|
+
| `complete` | 正常渲染完整 Markdown |
|
|
92
|
+
| `streaming` | 自动补全未闭合的 Markdown 语法(代码块、列表等),节流解析(5ms) |
|
|
93
|
+
| `pending` | 同 `complete`(按当前内容渲染) |
|
|
94
|
+
| `error` | 渲染为 `CommonErrorContent`(红色错误图标 + `content` 文本) |
|
|
95
|
+
| `stop` | 同 `complete` |
|
|
96
|
+
|
|
97
|
+
**错误状态示例**
|
|
98
|
+
|
|
99
|
+
## 引用文档列表
|
|
100
|
+
|
|
101
|
+
`content` 传入 `ReferenceDocumentContent[]` 数组时,自动渲染为 `ReferenceContent`(引用文档列表):
|
|
102
|
+
|
|
103
|
+
```vue
|
|
104
|
+
<template>
|
|
105
|
+
<ContentRender :content="referenceContent" />
|
|
106
|
+
</template>
|
|
107
|
+
|
|
108
|
+
<script setup lang="ts">
|
|
109
|
+
import { ContentRender, type ReferenceDocumentContent } from '@blueking/chat-x';
|
|
110
|
+
|
|
111
|
+
const referenceContent: ReferenceDocumentContent[] = [
|
|
112
|
+
{
|
|
113
|
+
name: 'Vue 3 官方文档',
|
|
114
|
+
url: 'https://vuejs.org',
|
|
115
|
+
originFile: 'vue3-guide.md', // 有 originFile 时显示预览和跳转图标
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: 'TypeScript 手册',
|
|
119
|
+
url: 'https://www.typescriptlang.org',
|
|
120
|
+
originFile: '', // 无 originFile 时不显示操作图标
|
|
121
|
+
},
|
|
122
|
+
];
|
|
123
|
+
</script>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**渲染效果**(悬停条目查看图标,有 `originFile` 的条目显示预览和跳转图标)
|
|
127
|
+
|
|
128
|
+
### ReferenceContent 图标显示规则
|
|
129
|
+
|
|
130
|
+
| 条件 | 显示图标 |
|
|
131
|
+
| ------------------------------ | -------------------------------------------- |
|
|
132
|
+
| 始终 | 文档图标(红色) |
|
|
133
|
+
| `url` 和 `originFile` 均不为空 | 预览图标(悬停可见) |
|
|
134
|
+
| `url` 和 `originFile` 均不为空 | 跳转图标(悬停可见,打开 `originFile` 链接) |
|
|
135
|
+
|
|
136
|
+
无 `originFile` 时只显示文档图标(点击文档名跳转 `url`):
|
|
137
|
+
|
|
138
|
+
## 自定义渲染(默认插槽)
|
|
139
|
+
|
|
140
|
+
默认插槽接收 `{ content }` 参数(原始 `content` prop 值),替换整个内容渲染:
|
|
141
|
+
|
|
142
|
+
```vue
|
|
143
|
+
<template>
|
|
144
|
+
<ContentRender
|
|
145
|
+
:content="content"
|
|
146
|
+
:status="status"
|
|
147
|
+
>
|
|
148
|
+
<template #default="{ content }">
|
|
149
|
+
<div class="custom-content">
|
|
150
|
+
<h3>自定义渲染</h3>
|
|
151
|
+
<pre>{{ JSON.stringify(content, null, 2) }}</pre>
|
|
152
|
+
</div>
|
|
153
|
+
</template>
|
|
154
|
+
</ContentRender>
|
|
155
|
+
</template>
|
|
156
|
+
|
|
157
|
+
<script setup lang="ts">
|
|
158
|
+
import { ContentRender } from '@blueking/chat-x';
|
|
159
|
+
|
|
160
|
+
const content = '自定义内容,由 slot 接管渲染。';
|
|
161
|
+
const status = 'complete';
|
|
162
|
+
</script>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**渲染效果**
|
|
166
|
+
|
|
167
|
+
## API
|
|
168
|
+
|
|
169
|
+
### Props
|
|
170
|
+
|
|
171
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
172
|
+
| ------- | -------------------------------------- | ---- | ----------------------------------------------------------------------------------------- |
|
|
173
|
+
| content | `string \| ReferenceDocumentContent[]` | ✅ | 内容数据,字符串走 Markdown 渲染,数组走引用文档列表渲染 |
|
|
174
|
+
| status | `MessageStatus` | - | 消息状态,只影响 Markdown 渲染(`error` 时渲染错误样式,`streaming` 时补全语法) |
|
|
175
|
+
| type | `ContentType` | - | 内容类型提示,传入 `MessageContentType.Text` 可强制走 MarkdownContent;通常不需要显式传递 |
|
|
176
|
+
|
|
177
|
+
### Slots
|
|
178
|
+
|
|
179
|
+
| 插槽名 | 参数 | 说明 |
|
|
180
|
+
| ---------- | -------------------------------------- | ----------------------------------------------------------------------------- |
|
|
181
|
+
| codeHeader | `{ language: string; token: Token[] }` | 代码块头部自定义操作区域,透传给 MarkdownContent → CodeContent 的 header 插槽 |
|
|
182
|
+
| default | `{ content: ContentMap[T] }` | 自定义渲染,接收原始 content prop 值,替换全部默认逻辑 |
|
|
183
|
+
|
|
184
|
+
## 流式渲染机制
|
|
185
|
+
|
|
186
|
+
`streaming` 状态下,`MarkdownContent` 有以下优化:
|
|
187
|
+
|
|
188
|
+
1. **语法自动补全**:`completeMarkdownSyntax` 在解析前补全未闭合的代码块、列表等,避免渲染异常
|
|
189
|
+
2. **节流解析**:`parseMarkdownContent` 节流 5ms(leading + trailing),大幅降低流式输入时的解析开销
|
|
190
|
+
3. **不完整状态保护**:当正在输入 LaTeX 命令(如 `$\fra...`)时保持之前的渲染结果,避免闪烁
|
|
191
|
+
4. **CSS contain 性能隔离**:`.ai-markdown-content` 使用 `contain: layout style`,`.ai-markdown-body` 使用 `contain: content`,减少重排影响范围
|
|
192
|
+
5. **自动滚动**:每个 token 挂载后触发 `toScrollBottom()`(节流 100ms),与 `MessageContainer` 配合实现流式自动滚动
|
|
193
|
+
|
|
194
|
+
## 类型定义
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
import { MessageContentType, MessageStatus } from '@blueking/chat-x';
|
|
198
|
+
|
|
199
|
+
// 引用文档内容
|
|
200
|
+
type ReferenceDocumentContent = {
|
|
201
|
+
name: string; // 显示名称(为空时该条目被过滤,不渲染)
|
|
202
|
+
url: string; // 文档访问地址(点击文档名跳转)
|
|
203
|
+
originFile: string; // 原始文件地址(非空时显示预览和跳转图标)
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
// 内容类型(ContentType = keyof ContentMap)
|
|
207
|
+
enum MessageContentType {
|
|
208
|
+
Text = 'text', // 字符串,Markdown 渲染
|
|
209
|
+
ReferenceDocument = 'reference_document', // ReferenceDocumentContent[],引用列表
|
|
210
|
+
Binary = 'binary',
|
|
211
|
+
Function = 'function',
|
|
212
|
+
KeyValue = 'key_value',
|
|
213
|
+
KnowledgeRag = 'knowledge_rag',
|
|
214
|
+
Other = 'other',
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
> `MessageStatus` 完整取值见 [常量枚举](../../types/constants);本组件主要关心 `error`(错误内容)与流式相关状态。
|
|
219
|
+
|
|
220
|
+
## 使用场景
|
|
221
|
+
|
|
222
|
+
- **AI 文本回复渲染**:`AssistantMessage` 内部用 `ContentRender` 渲染 AI 回复内容,`status` 配合流式响应
|
|
223
|
+
- **知识库引用展示**:`ActivityMessage` 内部用 `ContentRender` 渲染引用文档列表
|
|
224
|
+
- **代码展示**:Markdown 代码块由 `CodeContent` 自动高亮(Atom One Dark 主题,支持 180+ 语言)
|
|
225
|
+
- **数学公式**:行内 `$...$` 和块级 `$$...$$`,由 KaTeX 渲染
|
|
226
|
+
- **流程图**:Mermaid 代码块自动渲染为 SVG 图表
|
|
227
|
+
- **自定义渲染**:通过 slot 接管渲染,实现表格、图表等自定义内容展示
|
|
228
|
+
|
|
229
|
+
## 关联组件
|
|
230
|
+
|
|
231
|
+
- [MarkdownContent](/components/rendering/markdown-content) — 字符串 Markdown 正文
|
|
232
|
+
- [ReferenceContent](/components/rendering/reference-content) — 引用文档数组
|
|
233
|
+
- [AssistantMessage](/components/message/assistant-message) — assistant 消息中默认使用
|