@blueking/chat-x 0.0.51-beta.5 → 0.0.52-dev.1
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 +15 -8
- package/dist/ag-ui/types/contents.d.ts +2 -0
- package/dist/ag-ui/types/messages.d.ts +6 -1
- package/dist/common/constants.d.ts +2 -0
- package/dist/components/ai-buttons/add-menu-btn/add-menu-btn.vue.d.ts +24 -0
- package/dist/components/chat-content/collapsible-content/collapsible-content.vue.d.ts +28 -0
- package/dist/components/chat-content/file-content/upload-file-item.vue.d.ts +5 -2
- package/dist/components/chat-content/file-content/upload-image-item.vue.d.ts +1 -0
- package/dist/components/chat-content/flow-agent-content/use-flow-node-actions.d.ts +1 -1
- package/dist/components/chat-input/ai-slash-input/ai-slash-input.vue.d.ts +21 -10
- package/dist/components/chat-input/ai-slash-input/command.d.ts +6 -3
- package/dist/components/chat-input/ai-slash-input/constants.d.ts +2 -0
- package/dist/components/chat-input/ai-slash-input/use-menu-trigger.d.ts +17 -0
- package/dist/components/chat-input/build-default-placeholder.d.ts +9 -3
- package/dist/components/chat-input/chat-input.vue.d.ts +30 -18
- package/dist/components/chat-input/input-menu/constants.d.ts +60 -0
- package/dist/components/chat-input/input-menu/index.d.ts +4 -0
- package/dist/components/chat-input/input-menu/input-menu-option.vue.d.ts +14 -0
- package/dist/components/chat-input/input-menu/input-menu-panel.vue.d.ts +17 -0
- package/dist/components/chat-input/input-menu/use-input-menu.d.ts +22 -0
- package/dist/components/chat-input/model-selector/types.d.ts +3 -2
- package/dist/components/chat-message/message-container/message-container.vue.d.ts +1 -1
- package/dist/components/chat-message/user-message/user-message.vue.d.ts +1 -1
- package/dist/components/mention/create-mention-tippy.d.ts +27 -0
- package/dist/components/mention/index.d.ts +4 -0
- package/dist/components/{chat-input/ai-slash-input/ai-prompt-list/ai-prompt-list.vue.d.ts → mention/mention-popover.vue.d.ts} +3 -2
- package/dist/components/{chat-input/ai-slash-input/ai-skill-list/ai-skill-list.vue.d.ts → mention/mention-tag.vue.d.ts} +7 -3
- package/dist/components/{chat-input/ai-slash-input/ai-slash-menu/ai-slash-menu.vue.d.ts → mention/mention-text.vue.d.ts} +3 -3
- package/dist/components/resource-icon/index.d.ts +1 -0
- package/dist/components/resource-icon/resource-icon.vue.d.ts +11 -0
- package/dist/composables/index.d.ts +1 -0
- package/dist/composables/use-artifact-preview.d.ts +5 -2
- package/dist/composables/use-common.d.ts +0 -9
- package/dist/composables/use-global-config.d.ts +4 -0
- package/dist/composables/use-input-mention.d.ts +13 -0
- package/dist/composables/use-message-group.d.ts +1011 -72
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/input.d.ts +21 -0
- package/dist/icons/menu-item.d.ts +22 -0
- package/dist/index.css +1 -1
- package/dist/index.js +4953 -4429
- package/dist/index.js.map +1 -1
- package/dist/lang/lang.d.ts +13 -3
- package/dist/mcp/generated/docs/activity-message.md +3 -3
- package/dist/mcp/generated/docs/add-menu-btn.md +91 -0
- package/dist/mcp/generated/docs/ai-slash-input.md +72 -26
- package/dist/mcp/generated/docs/assistant-message.md +7 -1
- package/dist/mcp/generated/docs/chat-container.md +45 -6
- package/dist/mcp/generated/docs/chat-input.md +327 -483
- package/dist/mcp/generated/docs/collapsible-content.md +78 -0
- package/dist/mcp/generated/docs/constants.md +36 -3
- package/dist/mcp/generated/docs/execution-summary.md +1 -23
- package/dist/mcp/generated/docs/file-artifact-panel.md +24 -5
- package/dist/mcp/generated/docs/file-content.md +4 -0
- package/dist/mcp/generated/docs/file-upload-btn.md +15 -12
- package/dist/mcp/generated/docs/flow-agent-content.md +10 -12
- package/dist/mcp/generated/docs/input-menu-panel.md +166 -0
- package/dist/mcp/generated/docs/mention-tag.md +83 -0
- package/dist/mcp/generated/docs/mention-text.md +86 -0
- package/dist/mcp/generated/docs/message-container.md +1 -1
- package/dist/mcp/generated/docs/message-render.md +1 -1
- package/dist/mcp/generated/docs/message-tools.md +15 -4
- package/dist/mcp/generated/docs/messages.md +3 -0
- package/dist/mcp/generated/docs/model-selector.md +4 -2
- package/dist/mcp/generated/docs/overflow-tips.md +3 -3
- package/dist/mcp/generated/docs/resource-icon.md +102 -0
- package/dist/mcp/generated/docs/text-content.md +7 -3
- package/dist/mcp/generated/docs/theme.md +27 -35
- package/dist/mcp/generated/docs/use-artifact-preview.md +7 -3
- package/dist/mcp/generated/docs/use-command-selection.md +1 -1
- package/dist/mcp/generated/docs/use-container-scroll.md +2 -1
- package/dist/mcp/generated/docs/use-flow-node-actions.md +8 -15
- package/dist/mcp/generated/docs/use-global-config.md +11 -4
- package/dist/mcp/generated/docs/use-input-mention.md +119 -0
- package/dist/mcp/generated/docs/use-menu-keydown.md +15 -16
- package/dist/mcp/generated/docs/use-message-group.md +3 -6
- package/dist/mcp/generated/docs/user-message.md +39 -17
- package/dist/mcp/generated/index.json +233 -81
- package/dist/types/editor.d.ts +0 -29
- package/dist/types/index.d.ts +1 -0
- package/dist/types/input-menu.d.ts +46 -0
- package/dist/utils/artifact-tags.d.ts +36 -0
- package/dist/utils/collect-message-artifacts.d.ts +14 -0
- package/dist/utils/file.d.ts +3 -3
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/upload-file.d.ts +6 -1
- package/package.json +3 -2
- package/skills/blueking-chat-x/SKILL.md +143 -0
- package/skills/blueking-chat-x/references/_index.md +153 -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/add-menu-btn.md +88 -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-selection.md +439 -0
- package/skills/blueking-chat-x/references/components/ai-slash-input.md +102 -0
- package/skills/blueking-chat-x/references/components/animation-text.md +202 -0
- package/skills/blueking-chat-x/references/components/assistant-message.md +504 -0
- package/skills/blueking-chat-x/references/components/chat-container.md +912 -0
- package/skills/blueking-chat-x/references/components/chat-input.md +614 -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/collapsible-content.md +76 -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 +150 -0
- package/skills/blueking-chat-x/references/components/file-artifact-panel.md +307 -0
- package/skills/blueking-chat-x/references/components/file-content.md +340 -0
- package/skills/blueking-chat-x/references/components/file-icon.md +109 -0
- package/skills/blueking-chat-x/references/components/file-upload-btn.md +162 -0
- package/skills/blueking-chat-x/references/components/flow-agent-content.md +266 -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/input-menu-panel.md +162 -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/mention-tag.md +79 -0
- package/skills/blueking-chat-x/references/components/mention-text.md +83 -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 +427 -0
- package/skills/blueking-chat-x/references/components/model-selector.md +157 -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/resource-icon.md +98 -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 +80 -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 +444 -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 +235 -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 +164 -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 +155 -0
- package/skills/blueking-chat-x/references/composables/use-input-mention.md +115 -0
- package/skills/blueking-chat-x/references/composables/use-menu-keydown.md +161 -0
- package/skills/blueking-chat-x/references/composables/use-message-group.md +244 -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/directives/index.md +61 -0
- package/skills/blueking-chat-x/references/directives/overflow-tips.md +205 -0
- package/skills/blueking-chat-x/references/icons/index.md +185 -0
- package/skills/blueking-chat-x/references/plugins/index.md +56 -0
- package/skills/blueking-chat-x/references/plugins/markdown-container.md +55 -0
- package/skills/blueking-chat-x/references/plugins/markdown-latex.md +205 -0
- package/skills/blueking-chat-x/references/plugins/markdown-mermaid.md +247 -0
- package/skills/blueking-chat-x/references/theme/theme.md +423 -0
- package/skills/blueking-chat-x/references/types/constants.md +340 -0
- package/skills/blueking-chat-x/references/types/index.md +120 -0
- package/skills/blueking-chat-x/references/types/interrupt.md +379 -0
- package/skills/blueking-chat-x/references/types/messages.md +556 -0
- package/skills/blueking-chat-x/references/types/schema.md +91 -0
- package/skills/blueking-chat-x/references/utils/index.md +196 -0
- package/skills/blueking-chat-x/scripts/generate-references.mjs +536 -0
- package/dist/components/chat-input/ai-slash-editor/ai-slash-editor.vue.d.ts +0 -28
- package/dist/components/chat-input/ai-slash-editor/theme.d.ts +0 -24
- package/dist/mcp/generated/docs/ai-prompt-list.md +0 -45
- package/dist/mcp/generated/docs/ai-skill-list.md +0 -75
- package/dist/mcp/generated/docs/ai-slash-editor.md +0 -43
- package/dist/mcp/generated/docs/ai-slash-menu.md +0 -42
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
# AssistantMessage AI 助手消息
|
|
2
|
+
|
|
3
|
+
> 能力域:消息系统 | 未从包入口导出:内部组件(入口的同名导出是 TS 类型,不是组件) | since 0.0.20
|
|
4
|
+
|
|
5
|
+
渲染助手 Markdown 正文、ToolCallRender 工具调用列表,以及 property.artifacts 文件卡片; 默认插槽仅覆盖正文。源码位置:src/components/chat-message/assistant-message/assistant-message.vue。
|
|
6
|
+
|
|
7
|
+
**关联**:message-render(由 MessageRender 在 role 为 assistant 时创建)、tool-message(工具结果通过 toolCall.toolMessage 内联或独立 tool 消息关联展示)、toolcall-render(多条工具调用由 ToolcallRender 统一渲染)、file-artifact-panel(property.artifacts 文件产物点击后在侧栏预览)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# AssistantMessage AI 助手消息
|
|
12
|
+
|
|
13
|
+
## 源码事实
|
|
14
|
+
|
|
15
|
+
- **源码位置**:`src/components/chat-message/assistant-message/assistant-message.vue`
|
|
16
|
+
- **能力域**:消息系统
|
|
17
|
+
- **能力说明**:渲染助手 Markdown 正文、工具调用列表与 `property.artifacts` 文件产物。
|
|
18
|
+
|
|
19
|
+
> **导出说明**:`AssistantMessage` **未**从 `@blueking/chat-x` 包入口导出(入口同名是 TS interface)。消费方请用 `MessageRender` / `MessageContainer`。下文 `AssistantMessageComp` 为文档站内部相对路径示例。
|
|
20
|
+
|
|
21
|
+
AI 助手消息展示组件:正文(Markdown)、工具调用(Tool Calls)、文件产物卡片。
|
|
22
|
+
|
|
23
|
+
## 渲染管线
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
AssistantMessage(根类名:ai-assistant-message)
|
|
27
|
+
├── ai-assistant-message-content(内容区,v-if content)
|
|
28
|
+
│ └── [default slot { content }] 或 ContentRender → MarkdownContent
|
|
29
|
+
├── ai-assistant-message-toolcalls(v-if toolCalls 非空,flex column,gap: 8px)
|
|
30
|
+
│ └── ToolCallRender × N(toolCalls,不受 slot 影响)
|
|
31
|
+
└── MessageArtifacts(v-if property.artifacts 非空)
|
|
32
|
+
└── ArtifactFileCard × N(点击卡片 → useArtifactPreview → 侧栏 FileArtifactPanel → ArtifactPreviewHost;
|
|
33
|
+
右侧操作区:引用(useInputMention)+ 下载)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
- **内容区**:`content` 经 `ContentRender`(`MessageContentType.Text`)由 `MarkdownContent` 渲染;default slot 仅收到 `{ content }`
|
|
37
|
+
- **工具调用区**:每个 `toolCall` 渲染一个 `ToolCallRender`,位于内容区下方;多条工具调用由 `.ai-assistant-message-toolcalls` 容器统一控制为 `8px` 间距,不受消息根节点 `12px` 间距影响
|
|
38
|
+
- **文件产物区**:读取 `property.artifacts`,用 `uid ?? String(id)` 作为 `messageUid` 传给 `MessageArtifacts`
|
|
39
|
+
|
|
40
|
+
## 基础用法
|
|
41
|
+
|
|
42
|
+
```vue
|
|
43
|
+
<template>
|
|
44
|
+
<MessageRender :message="message" />
|
|
45
|
+
</template>
|
|
46
|
+
|
|
47
|
+
<script setup lang="ts">
|
|
48
|
+
import { MessageRender, MessageRole, MessageStatus } from '@blueking/chat-x';
|
|
49
|
+
|
|
50
|
+
const message = {
|
|
51
|
+
id: '1',
|
|
52
|
+
messageId: '1',
|
|
53
|
+
role: MessageRole.Assistant,
|
|
54
|
+
content: '你好!我是 AI 助手,有什么可以帮助你的吗?',
|
|
55
|
+
status: MessageStatus.Complete,
|
|
56
|
+
};
|
|
57
|
+
</script>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**渲染效果**
|
|
61
|
+
|
|
62
|
+
## Markdown 内容渲染
|
|
63
|
+
|
|
64
|
+
`content` 支持 Markdown 格式,组件内部通过 `MarkdownContent` 自动渲染标题、列表、代码块、链接等:
|
|
65
|
+
|
|
66
|
+
```vue
|
|
67
|
+
<template>
|
|
68
|
+
<MessageRender :message="message" />
|
|
69
|
+
</template>
|
|
70
|
+
|
|
71
|
+
<script setup lang="ts">
|
|
72
|
+
import { MessageRender, MessageRole, MessageStatus } from '@blueking/chat-x';
|
|
73
|
+
|
|
74
|
+
const message = {
|
|
75
|
+
id: '1',
|
|
76
|
+
messageId: '1',
|
|
77
|
+
role: MessageRole.Assistant,
|
|
78
|
+
status: MessageStatus.Complete,
|
|
79
|
+
content: `## Vue 3 核心特性
|
|
80
|
+
|
|
81
|
+
Vue 3 引入了多项重要更新:
|
|
82
|
+
|
|
83
|
+
1. **Composition API**:提供更灵活的逻辑组织方式
|
|
84
|
+
2. **性能优化**:虚拟 DOM 重写,编译时优化
|
|
85
|
+
3. **TypeScript 支持**:内置完整的类型定义
|
|
86
|
+
|
|
87
|
+
\\\`\\\`\\\`typescript
|
|
88
|
+
import { ref, computed } from 'vue';
|
|
89
|
+
|
|
90
|
+
const count = ref(0);
|
|
91
|
+
const doubled = computed(() => count.value * 2);
|
|
92
|
+
\\\`\\\`\\\`
|
|
93
|
+
|
|
94
|
+
> 更多详情请参考 [Vue 3 官方文档](https://vuejs.org)。`,
|
|
95
|
+
};
|
|
96
|
+
</script>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**渲染效果**
|
|
100
|
+
|
|
101
|
+
## 消息状态
|
|
102
|
+
|
|
103
|
+
`status` 直接影响 **内容区**(`ContentRender`)。`ToolCallRender` 的状态**按工具维度推导**(见下方「工具调用状态推导」),不直接等于本组件的 `status`。
|
|
104
|
+
|
|
105
|
+
| `status` | 内容区效果 |
|
|
106
|
+
| ----------- | ----------------------------------- |
|
|
107
|
+
| `pending` | 正常渲染(通常 content 为空) |
|
|
108
|
+
| `streaming` | Markdown 自动补全未闭合语法 |
|
|
109
|
+
| `complete` | 正常渲染完整 Markdown |
|
|
110
|
+
| `error` | 红色错误图标 + content 作为错误提示 |
|
|
111
|
+
| `stop` | 正常渲染(内容停留在中止时的状态) |
|
|
112
|
+
|
|
113
|
+
### Pending
|
|
114
|
+
|
|
115
|
+
### Streaming
|
|
116
|
+
|
|
117
|
+
流式输出中,`MarkdownContent` 自动补全未闭合的 Markdown 语法(代码块、列表等),适合逐字/逐段追加内容:
|
|
118
|
+
|
|
119
|
+
### Complete
|
|
120
|
+
|
|
121
|
+
### Error
|
|
122
|
+
|
|
123
|
+
渲染为错误信息样式(红色错误图标),`content` 作为错误提示文案展示:
|
|
124
|
+
|
|
125
|
+
### Stop
|
|
126
|
+
|
|
127
|
+
用户手动中止生成,内容停留在中止时的状态,与 `complete` 表现相同:
|
|
128
|
+
|
|
129
|
+
## 工具调用
|
|
130
|
+
|
|
131
|
+
当 AI 回复中包含工具调用时,传入 `toolCalls` 数组,每项自动渲染为 `ToolCallRender`,位于内容区下方。传给每个 `ToolCallRender` 的 `status` 按下方优先级从 `toolCall.toolMessage` 推导,而非直接同步本组件的 `status`。
|
|
132
|
+
|
|
133
|
+
### 单个工具调用
|
|
134
|
+
|
|
135
|
+
```vue
|
|
136
|
+
<template>
|
|
137
|
+
<MessageRender :message="message" />
|
|
138
|
+
</template>
|
|
139
|
+
|
|
140
|
+
<script setup lang="ts">
|
|
141
|
+
import { MessageRender, MessageRole, MessageStatus } from '@blueking/chat-x';
|
|
142
|
+
|
|
143
|
+
const message = {
|
|
144
|
+
id: '1',
|
|
145
|
+
messageId: '1',
|
|
146
|
+
role: MessageRole.Assistant,
|
|
147
|
+
content: '让我帮你查询一下天气信息。',
|
|
148
|
+
status: MessageStatus.Complete,
|
|
149
|
+
toolCalls: [
|
|
150
|
+
{
|
|
151
|
+
id: 'call_1',
|
|
152
|
+
type: 'function',
|
|
153
|
+
function: {
|
|
154
|
+
name: 'get_weather',
|
|
155
|
+
arguments: '{"city": "北京", "unit": "celsius"}',
|
|
156
|
+
description: '获取指定城市的天气信息',
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
};
|
|
161
|
+
</script>
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**渲染效果**
|
|
165
|
+
|
|
166
|
+
### 多个工具调用
|
|
167
|
+
|
|
168
|
+
AI 可在一次回复中发起多个工具调用,组件依次渲染:
|
|
169
|
+
|
|
170
|
+
```vue
|
|
171
|
+
<script setup lang="ts">
|
|
172
|
+
const toolCalls = [
|
|
173
|
+
{
|
|
174
|
+
id: 'call_1',
|
|
175
|
+
type: 'function',
|
|
176
|
+
function: {
|
|
177
|
+
name: 'search_documents',
|
|
178
|
+
arguments: '{"query": "Vue 3 Composition API"}',
|
|
179
|
+
description: '搜索知识库中的相关文档',
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
id: 'call_2',
|
|
184
|
+
type: 'function',
|
|
185
|
+
function: {
|
|
186
|
+
name: 'get_code_snippet',
|
|
187
|
+
arguments: '{"language": "typescript", "topic": "ref vs reactive"}',
|
|
188
|
+
description: '获取代码示例片段',
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
];
|
|
192
|
+
</script>
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**渲染效果**
|
|
196
|
+
|
|
197
|
+
### MCP 工具调用
|
|
198
|
+
|
|
199
|
+
`function.type` 为 `'mcp'`(或旧数据仅有 `mcpName`)时,`ToolCallRender` 头部显示为「调用 MCP {mcpName} / {name}」:
|
|
200
|
+
|
|
201
|
+
```vue
|
|
202
|
+
<script setup lang="ts">
|
|
203
|
+
const toolCalls = [
|
|
204
|
+
{
|
|
205
|
+
id: 'call_mcp_1',
|
|
206
|
+
type: 'function',
|
|
207
|
+
function: {
|
|
208
|
+
type: 'mcp', // 调用类型,缺省时有 mcpName 也会兼容判定为 MCP
|
|
209
|
+
name: 'query_database',
|
|
210
|
+
arguments: '{"sql": "SELECT * FROM users LIMIT 10"}',
|
|
211
|
+
description: '执行数据库查询',
|
|
212
|
+
mcpName: 'database-server', // MCP 服务名
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
];
|
|
216
|
+
</script>
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**渲染效果**
|
|
220
|
+
|
|
221
|
+
### 携带执行结果
|
|
222
|
+
|
|
223
|
+
`toolMessage` 字段包含工具的执行结果;`ToolCallRender` 会展示返回内容(JSON 自动解析为键值对)和执行耗时:
|
|
224
|
+
|
|
225
|
+
```vue
|
|
226
|
+
<script setup lang="ts">
|
|
227
|
+
const toolCalls = [
|
|
228
|
+
{
|
|
229
|
+
id: 'call_1',
|
|
230
|
+
type: 'function',
|
|
231
|
+
function: {
|
|
232
|
+
name: 'get_weather',
|
|
233
|
+
arguments: '{"city": "北京"}',
|
|
234
|
+
description: '获取天气信息',
|
|
235
|
+
},
|
|
236
|
+
toolMessage: {
|
|
237
|
+
role: 'tool',
|
|
238
|
+
content: '{"weather":"晴","temperature":"22°C","humidity":"45%","wind":"东北风 3 级"}',
|
|
239
|
+
status: 'complete',
|
|
240
|
+
duration: 1200, // 毫秒
|
|
241
|
+
toolCallId: 'call_1',
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
];
|
|
245
|
+
</script>
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**渲染效果**(点击展开箭头可查看返回结果)
|
|
249
|
+
|
|
250
|
+
### 工具调用失败
|
|
251
|
+
|
|
252
|
+
`toolMessage.error` 不为空时,`ToolCallRender` 显示错误信息:
|
|
253
|
+
|
|
254
|
+
```vue
|
|
255
|
+
<script setup lang="ts">
|
|
256
|
+
const toolCalls = [
|
|
257
|
+
{
|
|
258
|
+
id: 'call_1',
|
|
259
|
+
type: 'function',
|
|
260
|
+
function: {
|
|
261
|
+
name: 'get_weather',
|
|
262
|
+
arguments: '{"city": "北京"}',
|
|
263
|
+
description: '获取天气信息',
|
|
264
|
+
},
|
|
265
|
+
toolMessage: {
|
|
266
|
+
role: 'tool',
|
|
267
|
+
content: '',
|
|
268
|
+
status: 'error',
|
|
269
|
+
error: 'API rate limit exceeded',
|
|
270
|
+
duration: 350,
|
|
271
|
+
toolCallId: 'call_1',
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
];
|
|
275
|
+
</script>
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
**渲染效果**
|
|
279
|
+
|
|
280
|
+
### 工具调用状态推导
|
|
281
|
+
|
|
282
|
+
传给每个 `ToolCallRender` 的 `status` 按以下优先级计算:
|
|
283
|
+
|
|
284
|
+
1. 无 `toolMessage` → `MessageStatus.Pending`(进行中)
|
|
285
|
+
2. `toolMessage.error` 为真 → `MessageStatus.Error`(失败)
|
|
286
|
+
3. 否则 → `toolMessage.status ??` 本组件 `status`
|
|
287
|
+
|
|
288
|
+
**进行中**(有 `toolCalls`、尚无 `toolMessage`;即便助手 `status` 已是 `complete`,工具调用仍显示「正在调用」):
|
|
289
|
+
|
|
290
|
+
**成功**(`toolMessage.status = "complete"`):
|
|
291
|
+
|
|
292
|
+
## 自定义内容渲染
|
|
293
|
+
|
|
294
|
+
默认插槽替换**内容区**的渲染(即 `ContentRender` 部分),工具调用仍在内容区外独立渲染,不受插槽影响:
|
|
295
|
+
|
|
296
|
+
```
|
|
297
|
+
[自定义 slot 内容] ← 替换 ai-assistant-message-content 内默认渲染
|
|
298
|
+
[ToolCallRender] ← 不受影响,仍正常渲染
|
|
299
|
+
[ToolCallRender]
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
```vue
|
|
303
|
+
<template>
|
|
304
|
+
<MessageRender :message="message">
|
|
305
|
+
<template #default="{ content }">
|
|
306
|
+
<div style="padding: 12px; background: #f0f9ff; border-left: 3px solid #3a84ff; border-radius: 4px;">
|
|
307
|
+
{{ content }}
|
|
308
|
+
</div>
|
|
309
|
+
</template>
|
|
310
|
+
</MessageRender>
|
|
311
|
+
</template>
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
> **注意**:使用默认插槽后,内置 Markdown 渲染被替换,需自行处理格式化。slot 运行时仅保证 `{ content }`(见 [MessageRender](/components/message/message-render))。
|
|
315
|
+
|
|
316
|
+
**渲染效果**
|
|
317
|
+
|
|
318
|
+
## 在 MessageContainer 中使用
|
|
319
|
+
|
|
320
|
+
`AssistantMessage` 通常不需要单独引入,`MessageContainer` 会对 `role: 'assistant'` 的消息自动渲染:
|
|
321
|
+
|
|
322
|
+
```vue
|
|
323
|
+
<template>
|
|
324
|
+
<MessageContainer :messages="messages" />
|
|
325
|
+
</template>
|
|
326
|
+
|
|
327
|
+
<script setup lang="ts">
|
|
328
|
+
import { MessageContainer } from '@blueking/chat-x';
|
|
329
|
+
|
|
330
|
+
const messages = [
|
|
331
|
+
{
|
|
332
|
+
id: '1',
|
|
333
|
+
messageId: '1',
|
|
334
|
+
role: 'user',
|
|
335
|
+
content: '北京今天天气怎么样?',
|
|
336
|
+
status: 'complete',
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
id: '2',
|
|
340
|
+
messageId: '2',
|
|
341
|
+
role: 'assistant',
|
|
342
|
+
content: '让我帮你查询一下天气信息。',
|
|
343
|
+
status: 'complete',
|
|
344
|
+
toolCalls: [
|
|
345
|
+
{
|
|
346
|
+
id: 'call_1',
|
|
347
|
+
type: 'function',
|
|
348
|
+
function: {
|
|
349
|
+
name: 'get_weather',
|
|
350
|
+
arguments: '{"city": "北京"}',
|
|
351
|
+
description: '获取天气',
|
|
352
|
+
},
|
|
353
|
+
toolMessage: {
|
|
354
|
+
role: 'tool',
|
|
355
|
+
content: '{"weather":"晴","temperature":"22°C"}',
|
|
356
|
+
status: 'complete',
|
|
357
|
+
duration: 800,
|
|
358
|
+
toolCallId: 'call_1',
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
],
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
id: '3',
|
|
365
|
+
messageId: '3',
|
|
366
|
+
role: 'assistant',
|
|
367
|
+
content: '北京今天天气晴朗,气温 22°C,适合出行。',
|
|
368
|
+
status: 'complete',
|
|
369
|
+
},
|
|
370
|
+
];
|
|
371
|
+
</script>
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
## 文件产物
|
|
375
|
+
|
|
376
|
+
当 `property.artifacts` 非空时,在工具调用区下方渲染 `MessageArtifacts` 文件卡片列表。点击卡片会通过 `useArtifactPreview` 打开 `ChatContainer` 侧栏「文件产物」Tab(见 [FileArtifactPanel](/components/message/file-artifact-panel))。
|
|
377
|
+
|
|
378
|
+
卡片右侧的操作区在 hover 时出现,按设计稿顺序为「引用」「下载」:
|
|
379
|
+
|
|
380
|
+
- **引用**:仅当存在 [useInputMention](/composables/use-input-mention) 上下文(即页面有输入框)时渲染,点击后文件以资源标签形态进入输入框
|
|
381
|
+
- **下载**:有外部 `onDownload` 或容器具备异步取链能力(传了 `onArtifactClick`)时渲染,取链期间图标切为 Loading
|
|
382
|
+
|
|
383
|
+
`AIFileInfo` 仅含元信息(`name` / `outputId` / `size` / `type`);`download_url` / `preview_url` 由容器 `onArtifactClick` 异步获取。命中唯一文件依赖 `messageUid = uid ?? String(id)` + 卡片下标 + `outputId`。
|
|
384
|
+
|
|
385
|
+
侧栏预览由面板内 `ArtifactPreviewHost` 按**文件分类**分派(详见面板文档「预览机制」):
|
|
386
|
+
|
|
387
|
+
| 分类 | 典型 type | 预览依赖 | 渲染 |
|
|
388
|
+
| ---- | --------- | -------- | ---- |
|
|
389
|
+
| 源码 / 配置 | `py` / `ts` / `json` / `yaml` / `Dockerfile` | `download_url` | highlight.js 高亮 |
|
|
390
|
+
| Markdown | `md` / `markdown` | `download_url` | MarkdownContent 富文本 |
|
|
391
|
+
| HTML | `html` / `htm` | `download_url` | `<iframe srcdoc>` 真实渲染 |
|
|
392
|
+
| 纯文本 | `txt` / `rst` | `download_url` | `<pre>` |
|
|
393
|
+
| 图片 | `png` / `jpg` / `svg` | `preview_url` | `<img>` |
|
|
394
|
+
| 其余(含未知类型) | `pdf` / `docx` / `xlsx` | `preview_url` | iframe(一般为后台转好的 PDF) |
|
|
395
|
+
|
|
396
|
+
`type` 为扩展名字符串(大小写不敏感),缺省时回退文件名推断;`md` 与 `markdown` 等价。预览重载、重试与取链约定见 [FileArtifactPanel 预览机制](/components/message/file-artifact-panel#预览机制)。
|
|
397
|
+
|
|
398
|
+
```vue
|
|
399
|
+
<template>
|
|
400
|
+
<MessageRender :message="message" />
|
|
401
|
+
</template>
|
|
402
|
+
|
|
403
|
+
<script setup lang="ts">
|
|
404
|
+
import { MessageRender, MessageRole, MessageStatus } from '@blueking/chat-x';
|
|
405
|
+
import type { AIFileInfo } from '@blueking/chat-x';
|
|
406
|
+
|
|
407
|
+
const artifacts: AIFileInfo[] = [
|
|
408
|
+
{ name: '监控大盘周报.html', outputId: 'output-html', size: 10240, type: 'html' },
|
|
409
|
+
{ name: '系统配置说明.md', outputId: 'output-md', size: 8192, type: 'md' },
|
|
410
|
+
{ name: '周例会纪要.txt', outputId: 'output-txt', size: 4096, type: 'txt' },
|
|
411
|
+
{ name: '告警策略配置.json', outputId: 'output-json', size: 2048, type: 'json' },
|
|
412
|
+
{ name: '立项说明书.pdf', outputId: 'output-pdf', size: 204800, type: 'pdf' },
|
|
413
|
+
{ name: '巡检现场照片.jpg', outputId: 'output-jpg', size: 1048576, type: 'jpg' },
|
|
414
|
+
];
|
|
415
|
+
|
|
416
|
+
const message = {
|
|
417
|
+
id: 'a1',
|
|
418
|
+
messageId: 'a1',
|
|
419
|
+
uid: 'assistant-uid-1',
|
|
420
|
+
role: MessageRole.Assistant,
|
|
421
|
+
status: MessageStatus.Complete,
|
|
422
|
+
content: '已为你生成一组评审材料,可点击卡片在侧栏预览或下载:',
|
|
423
|
+
property: { artifacts },
|
|
424
|
+
};
|
|
425
|
+
</script>
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
**渲染效果(文档站内部示例;无 Provider 时卡片不可点击预览)**
|
|
429
|
+
|
|
430
|
+
## API
|
|
431
|
+
|
|
432
|
+
### Props
|
|
433
|
+
|
|
434
|
+
组件 Props 来自 `Partial<AssistantMessage>`(所有字段均可选):
|
|
435
|
+
|
|
436
|
+
| 属性名 | 类型 | 说明 |
|
|
437
|
+
| --------- | ----------------------- | ----------------------------------------------------------------------------------------- |
|
|
438
|
+
| content | `string` | AI 回复文本,支持 Markdown;空值时不渲染内容区 |
|
|
439
|
+
| status | `MessageStatus` | 影响 ContentRender;ToolCallRender 在无 toolMessage.status 时回退使用此值 |
|
|
440
|
+
| toolCalls | `ToolCall[]` | 工具调用列表,每项渲染一个 `ToolCallRender` |
|
|
441
|
+
| id | `number \| string` | 消息 ID;无 `uid` 时回退为 `messageUid` |
|
|
442
|
+
| messageId | `number \| string` | 消息唯一标识 |
|
|
443
|
+
| uid | `string` | 优先作为文件产物命中 / 「在对话中定位」的 `messageUid` |
|
|
444
|
+
| name | `string` | 消息发送者名称(可选) |
|
|
445
|
+
| role | `MessageRole.Assistant` | 消息角色,固定为 `'assistant'` |
|
|
446
|
+
| property | `{ artifacts?: AIFileInfo[]; extra?: ... }` | **本组件消费** `property.artifacts` 渲染文件卡片;`extra` 等由上层按需使用 |
|
|
447
|
+
|
|
448
|
+
### Slots
|
|
449
|
+
|
|
450
|
+
| 插槽名 | 参数 | 说明 |
|
|
451
|
+
| ------- | --------------------- | ----------------------------------------------------------------- |
|
|
452
|
+
| default | `{ content: string }` | 替换内容区渲染;toolCalls / MessageArtifacts 在内容区外独立渲染 |
|
|
453
|
+
|
|
454
|
+
### Events / Expose
|
|
455
|
+
|
|
456
|
+
无。
|
|
457
|
+
|
|
458
|
+
## 类型定义
|
|
459
|
+
|
|
460
|
+
```typescript
|
|
461
|
+
import type { AssistantMessage, ToolCall, FunctionCall, ToolMessage } from '@blueking/chat-x';
|
|
462
|
+
|
|
463
|
+
interface AssistantMessage extends BaseMessage<MessageRole.Assistant> {
|
|
464
|
+
toolCalls?: ToolCall[];
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// 工具调用
|
|
468
|
+
type ToolCall = {
|
|
469
|
+
id: string;
|
|
470
|
+
type: MessageContentType.Function; // 固定为 'function'
|
|
471
|
+
function: FunctionCall;
|
|
472
|
+
toolMessage?: Partial<ToolMessage>; // 工具执行结果(可选)
|
|
473
|
+
};
|
|
474
|
+
|
|
475
|
+
// 函数调用信息
|
|
476
|
+
type FunctionCall = {
|
|
477
|
+
name: string; // 函数名
|
|
478
|
+
arguments: string; // JSON 字符串格式的参数
|
|
479
|
+
description?: string; // 函数描述
|
|
480
|
+
mcpName?: string; // MCP 服务名(存在时标题显示 "调用 MCP")
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
// 工具执行结果
|
|
484
|
+
interface ToolMessage extends BaseMessage<MessageRole.Tool, string> {
|
|
485
|
+
toolCallId: string; // 对应的 ToolCall.id
|
|
486
|
+
duration: number; // 执行耗时(ms)
|
|
487
|
+
error?: string; // 错误信息(存在时 ToolCallRender 显示失败状态)
|
|
488
|
+
}
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
## 使用场景
|
|
492
|
+
|
|
493
|
+
- **文本消息展示**:聊天界面渲染 AI 回复的 Markdown 文本
|
|
494
|
+
- **工具调用过程展示**:展示 Function Call / MCP 调用的参数、状态和返回结果
|
|
495
|
+
- **流式输出**:`streaming` 状态下 Markdown 自动补全未闭合语法,配合流式响应实时更新
|
|
496
|
+
- **自动渲染**:通过 `MessageContainer` 对 `role: 'assistant'` 消息自动处理,无需手动引入
|
|
497
|
+
- **自定义内容渲染**:通过默认插槽替换内置 Markdown 渲染器,保留工具调用渲染
|
|
498
|
+
|
|
499
|
+
## 关联组件
|
|
500
|
+
|
|
501
|
+
- [MessageRender](/components/message/message-render) — assistant 角色由其实例化
|
|
502
|
+
- [ToolMessage](/components/message/tool-message) — 工具执行结果可通过 toolCall.toolMessage 内联
|
|
503
|
+
- [ToolcallRender](/components/agent/toolcall-render) — 工具调用列表渲染
|
|
504
|
+
- [FileArtifactPanel](/components/message/file-artifact-panel) — 文件产物侧栏列表与分类型预览 Host
|