@blueking/chat-x 0.0.49-beta.1 → 0.0.49-beta.10
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/constants.d.ts +1 -0
- package/dist/ag-ui/types/file.d.ts +1 -11
- package/dist/ag-ui/types/messages.d.ts +2 -0
- package/dist/components/chat-message/assistant-message/assistant-message.vue.d.ts +12 -1
- package/dist/components/chat-message/assistant-message/message-artifacts/artifact-file-card.vue.d.ts +0 -2
- package/dist/components/chat-message/assistant-message/message-artifacts/artifact-preview/artifact-preview-host.vue.d.ts +6 -3
- package/dist/components/chat-message/assistant-message/message-artifacts/artifact-preview/preview-strategy.d.ts +4 -5
- package/dist/components/chat-message/assistant-message/message-artifacts/artifact-preview/renderers/code-preview.vue.d.ts +8 -0
- package/dist/components/chat-message/assistant-message/message-artifacts/artifact-preview/renderers/image-preview.vue.d.ts +7 -0
- package/dist/components/chat-message/assistant-message/message-artifacts/artifact-preview/use-artifact-preview-loader.d.ts +1 -0
- package/dist/components/chat-message/assistant-message/message-artifacts/file-artifact-panel.vue.d.ts +1 -0
- package/dist/components/chat-message/assistant-message/message-artifacts/message-artifacts.vue.d.ts +0 -1
- package/dist/components/chat-message/interrupt-message/user-question/use-user-question.d.ts +7 -2
- package/dist/components/chat-message/user-message/user-message.vue.d.ts +15 -2
- package/dist/components/file-icon/file-icon.vue.d.ts +7 -0
- package/dist/components/index.d.ts +3 -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-artifact-preview.d.ts +8 -18
- package/dist/composables/use-container-scroll.d.ts +9 -2
- package/dist/composables/use-custom-tab.d.ts +7 -3
- package/dist/composables/use-global-config.d.ts +3 -0
- package/dist/composables/use-message-group.d.ts +145 -74
- package/dist/icons/file-icons.d.ts +4 -0
- package/dist/icons/file.d.ts +0 -18
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/tools.d.ts +3 -0
- package/dist/index.css +1 -1
- package/dist/index.js +2939 -2587
- package/dist/index.js.map +1 -1
- package/dist/lang/lang.d.ts +4 -1
- package/dist/mcp/generated/docs/assistant-message.md +28 -20
- package/dist/mcp/generated/docs/chat-container.md +36 -31
- package/dist/mcp/generated/docs/chat-input.md +2 -10
- package/dist/mcp/generated/docs/constants.md +3 -1
- package/dist/mcp/generated/docs/content-render.md +2 -10
- package/dist/mcp/generated/docs/execution-summary.md +3 -3
- package/dist/mcp/generated/docs/file-artifact-panel.md +60 -46
- package/dist/mcp/generated/docs/file-icon.md +111 -0
- package/dist/mcp/generated/docs/info-message.md +6 -5
- package/dist/mcp/generated/docs/interrupt.md +1 -0
- package/dist/mcp/generated/docs/message-container.md +27 -23
- package/dist/mcp/generated/docs/message-render.md +4 -27
- 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/reasoning-message.md +2 -9
- package/dist/mcp/generated/docs/toolcall-render.md +18 -10
- package/dist/mcp/generated/docs/use-artifact-preview.md +52 -55
- package/dist/mcp/generated/docs/use-container-scroll.md +6 -2
- package/dist/mcp/generated/docs/use-custom-tab.md +25 -8
- package/dist/mcp/generated/docs/use-global-config.md +15 -5
- package/dist/mcp/generated/docs/use-message-group.md +21 -13
- package/dist/mcp/generated/docs/user-message.md +6 -0
- package/dist/mcp/generated/docs/user-question-card.md +6 -3
- package/dist/mcp/generated/index.json +68 -12
- package/dist/utils/file-type.d.ts +14 -0
- package/dist/utils/index.d.ts +1 -0
- package/package.json +2 -2
- package/dist/components/chat-message/assistant-message/message-artifacts/file-icon.d.ts +0 -29
package/dist/lang/lang.d.ts
CHANGED
|
@@ -37,6 +37,7 @@ export declare const lang: {
|
|
|
37
37
|
readonly 停止生成: "Stop generating";
|
|
38
38
|
readonly 正在停止: "Stopping";
|
|
39
39
|
readonly 耗时: "Duration";
|
|
40
|
+
readonly 昨天: "Yesterday";
|
|
40
41
|
readonly 参数: "Parameters";
|
|
41
42
|
readonly 描述: "Description";
|
|
42
43
|
readonly 执行情况: "Execution Status";
|
|
@@ -145,6 +146,8 @@ export declare const lang: {
|
|
|
145
146
|
readonly 单选: "Single";
|
|
146
147
|
readonly 多选: "Multiple";
|
|
147
148
|
readonly 其他: "Others";
|
|
149
|
+
readonly 已完成: "Completed";
|
|
150
|
+
readonly 题: "question(s)";
|
|
148
151
|
readonly 回答内容: "Answers";
|
|
149
152
|
readonly 已回复: "Replied";
|
|
150
153
|
readonly '\u8BF7\u8F93\u5165...': "Please enter...";
|
|
@@ -154,4 +157,4 @@ export declare const lang: {
|
|
|
154
157
|
readonly 预览加载失败: "Failed to load preview";
|
|
155
158
|
readonly 暂无可预览的文件: "No file to preview";
|
|
156
159
|
};
|
|
157
|
-
export declare const t: (key: keyof typeof lang) => "Send" | "Stop" | "Ask AI" | "Copy" | "Share" | "Like" | "Unsatisfied" | "Delete" | "Quote" | "Regenerate" | "Regenerating will clear the content below" | "Submit" | "Cancel" | "Preview Content" | "Jump to Detail" | "Call Tool:" | "Calling..." | "Call Success" | "Call Failed" | "Tell us your thoughts" | "What makes you satisfied?" | "What makes you dissatisfied?" | "Return Content" | "Edit" | "Deep Thinking" | "Quick Thinking" | "Image to Text" | "Loading image..." | "Failed to load image" | "Thinking..." | "Thinking Completed" | "Thinking Failed" | "Copy Success" | "Copy Failed" | "Return to bottom" | "Stop generating" | "Stopping" | "Duration" | "Parameters" | "Description" | "Execution Status" | "Running" | "Success" | "Failed" | "Pending" | "To Be Executed" | "Details" | "Retry" | "Retrying" | "Skipping" | "The task is retrying and cannot be skipped" | "The task is skipping and cannot be retried" | "Node" | "Node Config" | "Node Output" | "Basic Info" | "Flow Template" | "Node Name" | "Step Name" | "Execution Plan" | "Optional" | "Failure Handler" | "Timeout Control" | "Yes" | "No" | "Input Params" | "Output Params" | "Param Name" | "Param Value" | "Name" | "Structured Output" | "Manual Skip" | "No Data" | "Call MCP:" | "More" | "Algorithm Plan Review Ticket" | "Reviewing" | "Approving" | "Abandoned" | "Approved" | "Cancelled" | "Expired" | "Rejected" | "Revoked" | "Ticket No." | "Submitted At" | "Current Handler" | "None" | "View Ticket Detail" | "Copy Ticket" | "Copy Ticket Link" | "Cancel Approval" | "Approval Cancelled" | "Refresh Ticket Status" | "This ticket has been rejected and cannot be cancelled" | "This ticket has been approved and cannot be cancelled" | "This ticket has been cancelled, no need to click again" | "Approval cannot be cancelled in the current status" | "There are {count} pending approval tickets in the current conversation. To continue, cancel approval first." | "Unsupported interrupt message" | "Searching" | "Search Completed" | "Upload File" | "Select model" | "Search models" | "Requesting..." | "Cancel satisfied" | "Cancel dissatisfied" | "Confirm delete this answer?" | "This operation cannot be undone. Please proceed with caution!" | "Preview" | "Zoom Out" | "Zoom In" | "Rotate" | "Download" | "Sorry, image loading failed. Please try reloading." | "Reset" | "Reload" | "W" | "H" | "Upload Image" | "Search keyword" | "Select date" | "Locate in Chat" | "Select All" | "Confirm" | "Upload Image, up to 3 images supported, max 2.4MB each" | "Hello, I am BlueKing AI Bot" | "Clear Search" | "Search Result is Empty" | "Valid Evidence" | "Full Screen" | "Exit Full Screen" | "Please choose to continue" | "Continue" | "Received: " | "Done" | "Skip" | "Single" | "Multiple" | "Others" | "Answers" | "Replied" | "Please enter..." | "File Artifacts" | "File List" | "Search file keyword" | "Failed to load preview" | "No file to preview" | "发送" | "停止" | "问问小鲸" | "复制" | "分享" | "点赞" | "不满意" | "删除" | "引用" | "重新生成" | "重新生成将清空下文内容" | "提交" | "取消" | "预览内容" | "跳转详情" | "调用工具:" | "调用中" | "调用成功" | "调用失败" | "说出您的想法" | "什么原因让你满意?" | "什么原因让你不满意?" | "返回内容" | "编辑" | "深度思考" | "快速思考" | "图生文" | "图片加载中..." | "图片加载失败" | "思考中" | "已思考完成" | "思考失败" | "复制成功" | "复制失败" | "返回底部" | "停止生成" | "正在停止" | "耗时" | "参数" | "描述" | "执行情况" | "执行中" | "成功" | "失败" | "挂起" | "待执行" | "详情" | "重试" | "重试中" | "跳过中" | "任务正在重试中,不可跳过" | "任务正在跳过中,不可重试" | "节点" | "节点配置" | "节点输出" | "基础信息" | "流程模板" | "节点名称" | "步骤名称" | "执行方案" | "是否可选" | "失败处理" | "超时控制" | "是" | "否" | "输入参数" | "输出参数" | "参数名" | "参数值" | "名称" | "变量说明" | "结构化输出" | "手动跳过" | "暂无数据" | "调用 MCP:" | "更多" | "算法方案评审单" | "评审中" | "审批中" | "已废弃" | "已批准" | "已通过" | "已取消" | "已过期" | "已拒绝" | "已撤销" | "单据编号" | "提交时间" | "当前处理人" | "无" | "查看单据详情" | "复制单据" | "复制单据链接" | "取消审批" | "已取消审批" | "刷新单据状态" | "单据已取消审批" | "该单据已被拒绝,无法取消" | "该单据已通过,无法取消" | "单据已取消,无需重复点击" | "当前状态无法取消审批" | "当前会话有 {count} 个待审批单,如需继续,请先取消审批" | "暂不支持的中断消息" | "检索中" | "检索完成" | "上传文件" | "选择模型" | "搜索模型关键字" | "请求中..." | "取消满意" | "取消不满意" | "确认删除该回答?" | "删除操作无法撤回,请谨慎操作!" | "预览" | "缩小" | "放大" | "旋转" | "下载" | "抱歉,图片加载失败,可尝试重新加载" | "重置" | "重新加载" | "宽" | "高" | "上传图片" | "搜索 关键字" | "选择日期" | "在对话中定位" | "全选" | "确定" | "上传图片, 最多支持上传 3 个, 最大支持 2.4MB" | "你好,我是小鲸" | "清空搜索" | "搜索结果为空" | "有效证据" | "全屏" | "退出全屏" | "请选择以继续" | "继续" | "收到信息:" | "待审批" | "已审批" | "完成" | "跳过" | "单选" | "多选" | "其他" | "回答内容" | "已回复" | "请输入..." | "文件产物" | "文件列表" | "搜索文件关键字" | "预览加载失败" | "暂无可预览的文件";
|
|
160
|
+
export declare const t: (key: keyof typeof lang) => "Send" | "Stop" | "Ask AI" | "Copy" | "Share" | "Like" | "Unsatisfied" | "Delete" | "Quote" | "Regenerate" | "Regenerating will clear the content below" | "Submit" | "Cancel" | "Preview Content" | "Jump to Detail" | "Call Tool:" | "Calling..." | "Call Success" | "Call Failed" | "Tell us your thoughts" | "What makes you satisfied?" | "What makes you dissatisfied?" | "Return Content" | "Edit" | "Deep Thinking" | "Quick Thinking" | "Image to Text" | "Loading image..." | "Failed to load image" | "Thinking..." | "Thinking Completed" | "Thinking Failed" | "Copy Success" | "Copy Failed" | "Return to bottom" | "Stop generating" | "Stopping" | "Duration" | "Yesterday" | "Parameters" | "Description" | "Execution Status" | "Running" | "Success" | "Failed" | "Pending" | "To Be Executed" | "Details" | "Retry" | "Retrying" | "Skipping" | "The task is retrying and cannot be skipped" | "The task is skipping and cannot be retried" | "Node" | "Node Config" | "Node Output" | "Basic Info" | "Flow Template" | "Node Name" | "Step Name" | "Execution Plan" | "Optional" | "Failure Handler" | "Timeout Control" | "Yes" | "No" | "Input Params" | "Output Params" | "Param Name" | "Param Value" | "Name" | "Structured Output" | "Manual Skip" | "No Data" | "Call MCP:" | "More" | "Algorithm Plan Review Ticket" | "Reviewing" | "Approving" | "Abandoned" | "Approved" | "Cancelled" | "Expired" | "Rejected" | "Revoked" | "Ticket No." | "Submitted At" | "Current Handler" | "None" | "View Ticket Detail" | "Copy Ticket" | "Copy Ticket Link" | "Cancel Approval" | "Approval Cancelled" | "Refresh Ticket Status" | "This ticket has been rejected and cannot be cancelled" | "This ticket has been approved and cannot be cancelled" | "This ticket has been cancelled, no need to click again" | "Approval cannot be cancelled in the current status" | "There are {count} pending approval tickets in the current conversation. To continue, cancel approval first." | "Unsupported interrupt message" | "Searching" | "Search Completed" | "Upload File" | "Select model" | "Search models" | "Requesting..." | "Cancel satisfied" | "Cancel dissatisfied" | "Confirm delete this answer?" | "This operation cannot be undone. Please proceed with caution!" | "Preview" | "Zoom Out" | "Zoom In" | "Rotate" | "Download" | "Sorry, image loading failed. Please try reloading." | "Reset" | "Reload" | "W" | "H" | "Upload Image" | "Search keyword" | "Select date" | "Locate in Chat" | "Select All" | "Confirm" | "Upload Image, up to 3 images supported, max 2.4MB each" | "Hello, I am BlueKing AI Bot" | "Clear Search" | "Search Result is Empty" | "Valid Evidence" | "Full Screen" | "Exit Full Screen" | "Please choose to continue" | "Continue" | "Received: " | "Done" | "Skip" | "Single" | "Multiple" | "Others" | "Completed" | "question(s)" | "Answers" | "Replied" | "Please enter..." | "File Artifacts" | "File List" | "Search file keyword" | "Failed to load preview" | "No file to preview" | "发送" | "停止" | "问问小鲸" | "复制" | "分享" | "点赞" | "不满意" | "删除" | "引用" | "重新生成" | "重新生成将清空下文内容" | "提交" | "取消" | "预览内容" | "跳转详情" | "调用工具:" | "调用中" | "调用成功" | "调用失败" | "说出您的想法" | "什么原因让你满意?" | "什么原因让你不满意?" | "返回内容" | "编辑" | "深度思考" | "快速思考" | "图生文" | "图片加载中..." | "图片加载失败" | "思考中" | "已思考完成" | "思考失败" | "复制成功" | "复制失败" | "返回底部" | "停止生成" | "正在停止" | "耗时" | "昨天" | "参数" | "描述" | "执行情况" | "执行中" | "成功" | "失败" | "挂起" | "待执行" | "详情" | "重试" | "重试中" | "跳过中" | "任务正在重试中,不可跳过" | "任务正在跳过中,不可重试" | "节点" | "节点配置" | "节点输出" | "基础信息" | "流程模板" | "节点名称" | "步骤名称" | "执行方案" | "是否可选" | "失败处理" | "超时控制" | "是" | "否" | "输入参数" | "输出参数" | "参数名" | "参数值" | "名称" | "变量说明" | "结构化输出" | "手动跳过" | "暂无数据" | "调用 MCP:" | "更多" | "算法方案评审单" | "评审中" | "审批中" | "已废弃" | "已批准" | "已通过" | "已取消" | "已过期" | "已拒绝" | "已撤销" | "单据编号" | "提交时间" | "当前处理人" | "无" | "查看单据详情" | "复制单据" | "复制单据链接" | "取消审批" | "已取消审批" | "刷新单据状态" | "单据已取消审批" | "该单据已被拒绝,无法取消" | "该单据已通过,无法取消" | "单据已取消,无需重复点击" | "当前状态无法取消审批" | "当前会话有 {count} 个待审批单,如需继续,请先取消审批" | "暂不支持的中断消息" | "检索中" | "检索完成" | "上传文件" | "选择模型" | "搜索模型关键字" | "请求中..." | "取消满意" | "取消不满意" | "确认删除该回答?" | "删除操作无法撤回,请谨慎操作!" | "预览" | "缩小" | "放大" | "旋转" | "下载" | "抱歉,图片加载失败,可尝试重新加载" | "重置" | "重新加载" | "宽" | "高" | "上传图片" | "搜索 关键字" | "选择日期" | "在对话中定位" | "全选" | "确定" | "上传图片, 最多支持上传 3 个, 最大支持 2.4MB" | "你好,我是小鲸" | "清空搜索" | "搜索结果为空" | "有效证据" | "全屏" | "退出全屏" | "请选择以继续" | "继续" | "收到信息:" | "待审批" | "已审批" | "完成" | "跳过" | "单选" | "多选" | "其他" | "已完成" | "题" | "回答内容" | "已回复" | "请输入..." | "文件产物" | "文件列表" | "搜索文件关键字" | "预览加载失败" | "暂无可预览的文件";
|
|
@@ -102,15 +102,15 @@ const doubled = computed(() => count.value * 2);
|
|
|
102
102
|
|
|
103
103
|
## 消息状态
|
|
104
104
|
|
|
105
|
-
`status`
|
|
105
|
+
`status` 直接影响 **内容区**(`ContentRender`)。`ToolCallRender` 的状态**按工具维度推导**(见下方「工具调用状态推导」),不直接等于本组件的 `status`。
|
|
106
106
|
|
|
107
|
-
| `status` | 内容区效果 |
|
|
108
|
-
| ----------- | ----------------------------------- |
|
|
109
|
-
| `pending` | 正常渲染(通常 content 为空) |
|
|
110
|
-
| `streaming` | Markdown 自动补全未闭合语法 |
|
|
111
|
-
| `complete` | 正常渲染完整 Markdown |
|
|
112
|
-
| `error` | 红色错误图标 + content 作为错误提示 |
|
|
113
|
-
| `stop` | 正常渲染(内容停留在中止时的状态) |
|
|
107
|
+
| `status` | 内容区效果 |
|
|
108
|
+
| ----------- | ----------------------------------- |
|
|
109
|
+
| `pending` | 正常渲染(通常 content 为空) |
|
|
110
|
+
| `streaming` | Markdown 自动补全未闭合语法 |
|
|
111
|
+
| `complete` | 正常渲染完整 Markdown |
|
|
112
|
+
| `error` | 红色错误图标 + content 作为错误提示 |
|
|
113
|
+
| `stop` | 正常渲染(内容停留在中止时的状态) |
|
|
114
114
|
|
|
115
115
|
### Pending
|
|
116
116
|
|
|
@@ -130,7 +130,7 @@ const doubled = computed(() => count.value * 2);
|
|
|
130
130
|
|
|
131
131
|
## 工具调用
|
|
132
132
|
|
|
133
|
-
当 AI 回复中包含工具调用时,传入 `toolCalls` 数组,每项自动渲染为 `ToolCallRender
|
|
133
|
+
当 AI 回复中包含工具调用时,传入 `toolCalls` 数组,每项自动渲染为 `ToolCallRender`,位于内容区下方。传给每个 `ToolCallRender` 的 `status` 按下方优先级从 `toolCall.toolMessage` 推导,而非直接同步本组件的 `status`。
|
|
134
134
|
|
|
135
135
|
### 单个工具调用
|
|
136
136
|
|
|
@@ -278,13 +278,17 @@ AI 可在一次回复中发起多个工具调用,组件依次渲染:
|
|
|
278
278
|
|
|
279
279
|
**渲染效果**
|
|
280
280
|
|
|
281
|
-
###
|
|
281
|
+
### 工具调用状态推导
|
|
282
282
|
|
|
283
|
-
`ToolCallRender`
|
|
283
|
+
传给每个 `ToolCallRender` 的 `status` 按以下优先级计算:
|
|
284
284
|
|
|
285
|
-
|
|
285
|
+
1. 无 `toolMessage` → `MessageStatus.Pending`(调用中)
|
|
286
|
+
2. `toolMessage.error` 为真 → `MessageStatus.Error`(调用失败)
|
|
287
|
+
3. 否则 → `toolMessage.status ??` 本组件 `status`
|
|
286
288
|
|
|
287
|
-
|
|
289
|
+
**调用中**(有 `toolCalls`、尚无 `toolMessage`;即便助手 `status` 已是 `complete` 也显示调用中):
|
|
290
|
+
|
|
291
|
+
**调用成功**(`toolMessage.status = "complete"`):
|
|
288
292
|
|
|
289
293
|
## 自定义内容渲染
|
|
290
294
|
|
|
@@ -374,14 +378,18 @@ AI 可在一次回复中发起多个工具调用,组件依次渲染:
|
|
|
374
378
|
|
|
375
379
|
`AIFileInfo` 仅含元信息(`name` / `outputId` / `size` / `type`);`download_url` / `preview_url` 由容器 `onArtifactClick` 异步获取。命中唯一文件依赖 `messageUid = uid ?? String(id)` + 卡片下标 + `outputId`。
|
|
376
380
|
|
|
377
|
-
侧栏预览由面板内 `ArtifactPreviewHost`
|
|
381
|
+
侧栏预览由面板内 `ArtifactPreviewHost` 按**文件分类**分派(详见面板文档「预览机制」):
|
|
378
382
|
|
|
379
|
-
| type | 预览依赖 | 渲染 |
|
|
380
|
-
| ---- | -------- | ---- |
|
|
381
|
-
| `
|
|
382
|
-
| `
|
|
383
|
+
| 分类 | 典型 type | 预览依赖 | 渲染 |
|
|
384
|
+
| ---- | --------- | -------- | ---- |
|
|
385
|
+
| 源码 / 配置 | `py` / `ts` / `json` / `yaml` / `Dockerfile` | `download_url` | highlight.js 高亮 |
|
|
386
|
+
| Markdown | `md` / `markdown` | `download_url` | MarkdownContent 富文本 |
|
|
387
|
+
| HTML | `html` / `htm` | `download_url` | `<iframe srcdoc>` 真实渲染 |
|
|
388
|
+
| 纯文本 | `txt` / `rst` | `download_url` | `<pre>` |
|
|
389
|
+
| 图片 | `png` / `jpg` / `svg` | `preview_url` | `<img>` |
|
|
390
|
+
| 其余(含未知类型) | `pdf` / `docx` / `xlsx` | `preview_url` | iframe(一般为后台转好的 PDF) |
|
|
383
391
|
|
|
384
|
-
`md` 与 `markdown`
|
|
392
|
+
`type` 为扩展名字符串(大小写不敏感),缺省时回退文件名推断;`md` 与 `markdown` 等价。预览重载、重试与取链约定见 [FileArtifactPanel 预览机制](/components/message/file-artifact-panel#预览机制)。
|
|
385
393
|
|
|
386
394
|
```vue
|
|
387
395
|
<template>
|
|
@@ -424,7 +432,7 @@ AI 可在一次回复中发起多个工具调用,组件依次渲染:
|
|
|
424
432
|
| 属性名 | 类型 | 说明 |
|
|
425
433
|
| --------- | ----------------------- | ----------------------------------------------------------------------------------------- |
|
|
426
434
|
| content | `string` | AI 回复文本,支持 Markdown;空值时不渲染内容区 |
|
|
427
|
-
| status | `MessageStatus` | 影响 ContentRender
|
|
435
|
+
| status | `MessageStatus` | 影响 ContentRender;ToolCallRender 在无 toolMessage.status 时回退使用此值 |
|
|
428
436
|
| toolCalls | `ToolCall[]` | 工具调用列表,每项渲染一个 `ToolCallRender` |
|
|
429
437
|
| id | `number \| string` | 消息 ID;无 `uid` 时回退为 `messageUid` |
|
|
430
438
|
| messageId | `number \| string` | 消息唯一标识 |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- AI SUMMARY -->
|
|
2
2
|
## 快速了解
|
|
3
3
|
|
|
4
|
-
完整对话容器,组合消息列表、输入区、模型选择、快捷指令、执行摘要、分享选择和自定义 Tab。 透传 models / selectedModel;支持 welcomeTitle 与 #welcome。 源码位置:src/components/chat-container/chat-container.vue。
|
|
4
|
+
完整对话容器,组合消息列表、输入区、模型选择、快捷指令、执行摘要、分享选择和自定义 Tab。 透传 models / selectedModel;支持 welcomeTitle 与 #welcome。 侧栏展开/折叠由外部 v-model:asideCollapsed 严格受控(传入后以外部值为准,内部展开动作仅发 update 事件),不再依赖执行数据或文件产物有无;无数据时侧栏照常展开并展示空态。 侧栏固定从右侧展开(无 placement prop),且不再内置折叠按钮。 「文件产物」Tab 常驻挂载。 源码位置:src/components/chat-container/chat-container.vue。
|
|
5
5
|
|
|
6
6
|
### 关联组件
|
|
7
7
|
- **message-container** — 消息列表与滚动区域
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
## 核心能力
|
|
24
24
|
|
|
25
|
-
- **分栏布局**:基于 `ResizeLayout
|
|
25
|
+
- **分栏布局**:基于 `ResizeLayout`,侧栏固定从右侧展开且无内置折叠按钮;展开 / 折叠由外部通过 `v-model:asideCollapsed` 判断,容器只负责渲染与回写,不再依赖 `executionGroups`、`keyword` 等数据条件。无数据时侧栏照常展开,由各面板展示空态
|
|
26
26
|
- **消息分组**:内置 `useMessageGroup`,自动分组、Tool 合并、Loading 注入
|
|
27
27
|
- **输入区状态推导**:对内 `messageStatus` 取 `inputStatus`——分组中存在 `LOADING_MESSAGE_ID`(`'__loading__'`)时用 `MessageStatus.Fetching`,否则用外部 `messageStatus`,保证「已发未流式」阶段也能停止、并避免重复发送
|
|
28
28
|
- **待审批发送阻塞**:存在 `AIDevToolApproval` 且为 `pending` / `draft` 时,输入区上方提示,并通过 `ChatInput.sendDisabledTip` 禁止发送
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
- **模型选择**:透传 `models`、`v-model:selectedModel` 与 `@modelChange` 至 `ChatInput`,传入 `models` 后在发送按钮左侧展示 [ModelSelector](/components/input/model-selector)
|
|
32
32
|
- **分享模式 / 渲染模式**:内置多选分享;`renderMode` 经 Provider 下传。`Share` 态开放侧栏只读查看,隐藏底部输入与「重试 / 跳过」等交互
|
|
33
33
|
- **字号主题**:`size` 为 `small`(默认 12px)/ `normal`(14px);根节点 `data-ai-size`,浮层同步 `document.body.dataset.aiSize`
|
|
34
|
+
- **消息时间时区**:`timezone` 经 `useGlobalConfig` 下传给 `MessageTime`,统一整个会话的时间展示时区;未配置时按浏览器时区
|
|
34
35
|
- **空状态欢迎页**:无消息时展示 Banner、`welcomeTitle`(默认「你好,我是小鲸」)与 `openingRemark`
|
|
35
36
|
|
|
36
37
|
## 组件结构
|
|
@@ -39,15 +40,14 @@
|
|
|
39
40
|
ai-chat-container(:data-ai-size="size")
|
|
40
41
|
├── Loading(chatLoading 时)
|
|
41
42
|
└── ResizeLayout
|
|
42
|
-
├── aside
|
|
43
|
-
│
|
|
43
|
+
├── aside(侧边栏,固定右侧)
|
|
44
|
+
│ └── .ai-full-screen-wrapper(全屏目标容器,ref=fullScreenRef)
|
|
44
45
|
│ │ ├── Tab 标签页
|
|
45
46
|
│ │ │ ├── 执行情况(默认 Tab)
|
|
46
47
|
│ │ │ ├── 自定义 Tab × N(可关闭;标签可由 getSideTabRenderComponent 自定义)
|
|
47
48
|
│ │ │ └── #setting → 全屏/退出全屏 ToolBtn
|
|
48
49
|
│ │ ├── ExecutionSummary(执行情况 Tab 内容)
|
|
49
50
|
│ │ └── 自定义 Tab 组件(getSideRenderComponent 优先,否则 data.component;可注入 #locateButton)
|
|
50
|
-
│ └── collapse-button(CollapsedIcon)
|
|
51
51
|
└── main(主内容区)
|
|
52
52
|
├── MessageContainer(有消息时;#group / #message 可自定义)
|
|
53
53
|
├── 欢迎页(无消息时 .ai-welcome-content)
|
|
@@ -133,17 +133,21 @@ ai-chat-container(:data-ai-size="size")
|
|
|
133
133
|
|
|
134
134
|
侧边栏默认包含「执行情况」Tab,展示所有工具调用和 FlowAgent 类型的 Activity 消息。支持关键词搜索过滤和点击定位到对话中的消息位置。
|
|
135
135
|
|
|
136
|
-
|
|
136
|
+
**展示条件**:侧栏是否渲染只取决于折叠态与是否存在可见 Tab —— `asideCollapsed === false` 且 `displayTabs` 非空即展开,与 `executionGroups`、`keyword`、是否有文件产物均无关。无执行数据时 `ExecutionSummary` 展示自身空态,无文件产物时 `FileArtifactPanel` 展示整块空态。`renderMode === Share` 分享态同样按折叠态展示侧栏(开放只读查看流程智能体详情/证据/执行情况),仅底部输入区保持隐藏。
|
|
137
137
|
|
|
138
|
-
|
|
138
|
+
**展开 / 折叠由外部判断(严格受控)**:只要传入了 `asideCollapsed`,折叠态就**一律以外部值为准**。容器内部的展开动作(点击文件卡片预览、`addCustomTab` 打开节点详情等)只发出 `update:asideCollapsed` 请求,外部不改值就不会展开 —— 所以务必用 `v-model:asideCollapsed` 绑定,只写 `:aside-collapsed` 会让这些内部入口失效。完全不传该 prop 时退化为组件内部状态(默认折叠),内部入口照常生效。容器不会因为数据变空而自动收起或重置自定义 Tab。
|
|
139
139
|
|
|
140
140
|
```vue
|
|
141
141
|
<template>
|
|
142
|
+
<!-- 业务方自行提供展开/收起入口;可复用包内 CollapsedAsideIcon -->
|
|
143
|
+
<button @click="asideCollapsed = !asideCollapsed">
|
|
144
|
+
{{ asideCollapsed ? '展开侧栏' : '收起侧栏' }}
|
|
145
|
+
</button>
|
|
142
146
|
<ChatContainer
|
|
143
147
|
v-model="inputValue"
|
|
148
|
+
v-model:aside-collapsed="asideCollapsed"
|
|
144
149
|
:messages="messages"
|
|
145
150
|
:message-status="messageStatus"
|
|
146
|
-
placement="left"
|
|
147
151
|
:on-send-message="handleSendMessage"
|
|
148
152
|
:on-agent-action="handleAgentAction"
|
|
149
153
|
@stop-streaming="handleStopStreaming"
|
|
@@ -152,6 +156,11 @@ ai-chat-container(:data-ai-size="size")
|
|
|
152
156
|
</template>
|
|
153
157
|
|
|
154
158
|
<script setup lang="ts">
|
|
159
|
+
import { shallowRef } from 'vue';
|
|
160
|
+
// import { CollapsedAsideIcon } from '@blueking/chat-x';
|
|
161
|
+
|
|
162
|
+
const asideCollapsed = shallowRef(true);
|
|
163
|
+
|
|
155
164
|
const handleCollapseChange = (isCollapse: boolean, resizeAsideWidth: number) => {
|
|
156
165
|
console.log('侧边栏折叠:', isCollapse, '宽度:', resizeAsideWidth);
|
|
157
166
|
};
|
|
@@ -160,16 +169,9 @@ ai-chat-container(:data-ai-size="size")
|
|
|
160
169
|
|
|
161
170
|
**渲染效果**(包含工具调用消息时,侧边栏自动展示「执行情况」)
|
|
162
171
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
| `placement` | 侧边栏位置 | 折叠按钮位置 | 折叠图标旋转 |
|
|
166
|
-
| ----------- | ------------ | ------------ | ------------ |
|
|
167
|
-
| `left` | 左侧(默认) | 主区域左边缘 | 折叠时旋转 180° |
|
|
168
|
-
| `right` | 右侧 | 主区域右边缘 | 默认旋转 180°,折叠时恢复 0° |
|
|
169
|
-
|
|
170
|
-
> 折叠按钮仅展示 `CollapsedIcon`(不再显示「执行情况」文案),通过图标旋转方向指示展开/折叠状态。
|
|
172
|
+
侧边栏固定从**右侧**展开(内部 `ResizeLayout` 的 `placement` 恒为 `right`),不再支持左侧布局,也不再内置折叠按钮 —— 展开 / 收起入口由业务方自行提供,通过 `v-model:asideCollapsed` 驱动。
|
|
171
173
|
|
|
172
|
-
|
|
174
|
+
**展开 / 收起动画**:侧栏宽度做 `0.3s cubic-bezier(0.4, 0, 0.2, 1)` 过渡,内容同步淡入淡出;动画期间内容锁定展开态宽度(CSS 变量 `--resize-aside-width`)由外层裁切,避免被压缩重排。拖拽调宽时过渡自动关闭,保证跟手。
|
|
173
175
|
|
|
174
176
|
## 侧栏全屏
|
|
175
177
|
|
|
@@ -183,7 +185,7 @@ ai-chat-container(:data-ai-size="size")
|
|
|
183
185
|
|
|
184
186
|
## 自定义 Tab
|
|
185
187
|
|
|
186
|
-
通过 `ref` 获取组件实例后,使用 `addCustomTab` / `removeCustomTab` 动态管理侧边栏 Tab
|
|
188
|
+
通过 `ref` 获取组件实例后,使用 `addCustomTab` / `removeCustomTab` 动态管理侧边栏 Tab。自定义 Tab 的生命周期由调用方掌控,容器不会因执行数据变空而自动清理(仅组件卸载时 `resetCustomTab`)。
|
|
187
189
|
|
|
188
190
|
### Tab 排序与显隐
|
|
189
191
|
|
|
@@ -241,12 +243,13 @@ ai-chat-container(:data-ai-size="size")
|
|
|
241
243
|
|
|
242
244
|
### 内置「文件产物」Tab
|
|
243
245
|
|
|
244
|
-
|
|
246
|
+
除「执行情况」外,容器内置一个常驻固定 Tab —— **「文件产物」**(`name: 'file-artifact'`),用于聚合预览当前会话所有 `AssistantMessage.property.artifacts`(按 `outputId` 去重):
|
|
245
247
|
|
|
246
|
-
-
|
|
248
|
+
- **常驻挂载 / 默认选中**:容器初始化即通过 `ensureCustomTab` 挂上该 Tab(不展开侧栏);因 `order: -1` 排在 Tab 栏首位,在用户未主动切换过 Tab 时它就是侧栏的默认面板。不随产物有无增删,无产物时由面板展示整块空态
|
|
249
|
+
- **主动打开**:点击 AI 回复中的文件卡片([ArtifactFileCard](/components/message/assistant-message))时,容器通过 `useArtifactPreviewProvider` 以 `outputId` 命中该文件,再 `addCustomTab` 展开侧栏并选中「文件产物」
|
|
247
250
|
- **排序 / 关闭**:`order: -1` 排在「执行情况」之前,`closable: false` 不可关闭
|
|
248
|
-
-
|
|
249
|
-
- **内容**:由 [FileArtifactPanel](/components/message/file-artifact-panel)
|
|
251
|
+
- **命中态维护**:产物列表为空时清空命中;命中项已不在列表时回落到第一个 `outputId`
|
|
252
|
+
- **内容**:由 [FileArtifactPanel](/components/message/file-artifact-panel) 渲染列表与下载头(无产物时为整块空态),预览委托内部 `ArtifactPreviewHost`;`download_url` / `preview_url` 通过 `onArtifactClick` 异步获取。文本类(`html` / `markdown` / `md` / `txt` / `json`)拉 `download_url` 正文直渲染(`md` 与 `markdown` 等价);其余类型用 `preview_url` iframe(一般为后台转好的 PDF)
|
|
250
253
|
- **状态管理**:命中、切换与 URL 缓存由 [useArtifactPreview](/composables/use-artifact-preview) 提供(Provider 在容器内、Consumer 在文件卡片 / 面板内);正文加载与分类型渲染由 Host 内部完成
|
|
251
254
|
- **未传 `onArtifactClick`**:下载按钮隐藏,预览区展示无数据
|
|
252
255
|
|
|
@@ -453,9 +456,9 @@ ai-chat-container(:data-ai-size="size")
|
|
|
453
456
|
|
|
454
457
|
## 用户问题中断
|
|
455
458
|
|
|
456
|
-
当会话中最近一条待处理 interrupt 包含 `InterruptReason.UserQuestion` 时,`ChatContainer` 会在 `ChatInput` 上方显示 [UserQuestionCard](/components/agent/user-question-card)
|
|
459
|
+
当会话中最近一条待处理 interrupt 包含 `InterruptReason.UserQuestion` 时,`ChatContainer` 会在 `ChatInput` 上方显示 [UserQuestionCard](/components/agent/user-question-card)(一次一题,标题栏可切换题目)。
|
|
457
460
|
|
|
458
|
-
-
|
|
461
|
+
- **结构化作答**:用户在卡片内逐题选择(单选可自动跳下一题),点击「完成」或「跳过」后通过 `onInterruptResume(payload, interrupt)` 回传 `UserQuestionResume`。
|
|
459
462
|
- **输入框发送**:用户也可在输入框直接点击发送;容器会调用 `onSendMessage(content, docSchema, options)`,其中 `options.interrupt` 为当前激活的 UserQuestion,`options.payload` 为 `buildSkipResumePayload` 生成的 skip resume(`status: 'cancelled'`,`answers: []`)。此时**不会自动清空**输入框,由业务侧在 `onSendMessage` 内决定如何处理 `content` 与中断恢复。
|
|
460
463
|
|
|
461
464
|
```vue
|
|
@@ -704,12 +707,12 @@ ChatContainer 的 Props 继承自 `ChatInputProps` 和 `MessageContainerProps`
|
|
|
704
707
|
| getSideTabRenderComponent | `(h, tab, { removeCustomTab }) => VNode \| undefined` | — | 自定义侧栏 Tab 标签渲染;未返回时使用默认图标 + 文案 + 关闭按钮 |
|
|
705
708
|
| models | `IModelOption[]` | — | 可选模型列表(继承自 ChatInput);传入后在发送按钮左侧展示 ModelSelector |
|
|
706
709
|
| openingRemark | `string` | — | 开场白,无消息时显示,支持 Markdown |
|
|
707
|
-
|
|
|
708
|
-
| resizeProps | `{ disabled?: boolean; initialDivide?: number \| string; max?: number; min?: number }` | — | 透传给内部 `ResizeLayout`;与默认 `collapsible: false`、`immediate: true`、`min: 400` 合并;`placement` 始终取自本组件。**数字型** `initialDivide` 还会作为内部侧栏宽度初值(驱动 `--resize-main-width`,并在展开时作为 `collapseChange` 的 `width`);百分比等字符串则回退为 `400` |
|
|
710
|
+
| resizeProps | `{ disabled?: boolean; initialDivide?: number \| string; max?: number; min?: number }` | — | 透传给内部 `ResizeLayout`;与默认 `collapsible: false`、`immediate: true`、`min: 400` 合并;`placement` 固定为 `right`,不可覆盖。**数字型** `initialDivide` 还会作为内部侧栏宽度初值(驱动 `--resize-main-width`,并在展开时作为 `collapseChange` 的 `width`);百分比等字符串则回退为 `400` |
|
|
709
711
|
| size | `'normal' \| 'small'` | `'small'` | 字号主题:`small` 12px / `normal` 14px;根节点设置 `data-ai-size` 并注入 `useGlobalConfig` |
|
|
712
|
+
| timezone | `string` | — | 消息时间展示所用的 IANA 时区名(如 `Asia/Shanghai`);经 `useGlobalConfig` 注入,未配置时按浏览器时区展示,详见 [MessageTime](/components/feedback/message-time) |
|
|
710
713
|
| welcomeTitle | `string` | — | 欢迎页标题;未传时默认展示「你好,我是小鲸」 |
|
|
711
714
|
| onCustomTabChange | `(tab: CustomTab) => Promise<any>` | — | 自定义 Tab 切换回调,返回值作为 Tab 组件 props |
|
|
712
|
-
| onArtifactClick | `(file: AIFileInfo) => Promise<{ download_url?: string; preview_url?: string }>` | — | 异步获取下载 /
|
|
715
|
+
| onArtifactClick | `(file: AIFileInfo) => Promise<{ download_url?: string; preview_url?: string }>` | — | 异步获取下载 / 预览链接(每次调用重新获取,无缓存;同文件并发去重)。文本类预览依赖 `download_url`,iframe 类依赖 `preview_url`;未传则隐藏下载、预览无数据 |
|
|
713
716
|
|
|
714
717
|
> 其余 Props(如 `messages`、`messageStatus`、`onSendMessage`、`shortcuts` 等)继承自 [ChatInput](/components/input/chat-input) 与 [MessageContainer](/components/setup/message-container)。
|
|
715
718
|
|
|
@@ -722,6 +725,7 @@ ChatContainer 的 Props 继承自 `ChatInputProps` 和 `MessageContainerProps`
|
|
|
722
725
|
| cite | `string` | 引用内容 |
|
|
723
726
|
| renderMode | `RenderMode` | 渲染模式(默认 `Chat`)。`Share` 开放侧栏只读查看并隐藏底部输入与交互操作;`Test` 隐藏分享按钮 |
|
|
724
727
|
| selectedModel | `string` | 当前选中模型的 `llm_name`,透传至 ChatInput 的 ModelSelector |
|
|
728
|
+
| asideCollapsed | `boolean` | 侧栏折叠态,**严格受控**:传入后一律以外部值为准,内部展开动作(文件预览、`addCustomTab`)只发 `update:asideCollapsed`,外部不改则不展开;不传时由组件内部自持(默认折叠) |
|
|
725
729
|
|
|
726
730
|
### Events
|
|
727
731
|
|
|
@@ -731,7 +735,8 @@ ChatContainer 的 Props 继承自 `ChatInputProps` 和 `MessageContainerProps`
|
|
|
731
735
|
| shortcutClose | — | 关闭快捷指令表单 |
|
|
732
736
|
| shortcutSubmit | `(formModel: Record<string, unknown>)` | 提交快捷指令表单 |
|
|
733
737
|
| confirmShare | `(messages: Message[], source?: IToolBtn)` | 确认分享/多选,携带选中的消息与触发按钮对象(`source`,用于区分 share/save 等场景) |
|
|
734
|
-
| collapseChange | `(isCollapse: boolean, width: number)` |
|
|
738
|
+
| collapseChange | `(isCollapse: boolean, width: number)` | 侧边栏折叠/展开状态变化(含宽度,便于外层容器扩宽) |
|
|
739
|
+
| update:asideCollapsed | `(collapsed: boolean)` | 折叠态变更请求(`v-model:asideCollapsed`);受控时是否真的展开取决于外部是否更新该值 |
|
|
735
740
|
| selectShortcut | `(shortcut: Shortcut)` | 选择快捷指令(继承自 ChatInput) |
|
|
736
741
|
| deleteShortcut | — | 删除已选快捷指令(继承自 ChatInput) |
|
|
737
742
|
| modelChange | `(model: IModelOption)` | 切换模型(继承自 ChatInput) |
|
|
@@ -762,10 +767,10 @@ ChatContainer 的 Props 继承自 `ChatInputProps` 和 `MessageContainerProps`
|
|
|
762
767
|
|
|
763
768
|
通过 `v-model:render-mode` 控制容器的渲染行为。`ChatContainer` 会把当前 `renderMode` 注入给后代组件,供内容渲染根据场景收敛交互能力。
|
|
764
769
|
|
|
765
|
-
| `renderMode` | 侧边栏 Tab
|
|
770
|
+
| `renderMode` | 侧边栏 Tab | 底部输入区域 | MessageTools 工具栏 | 说明 |
|
|
766
771
|
| ------------ | ---------------------- | --------------------------------- | --------------------- | -------------------------------- |
|
|
767
772
|
| `Chat` | 正常显示 | 正常显示(ChatInput / ShortcutRender / SelectionFooter) | 全部工具按钮 | 默认对话模式 |
|
|
768
|
-
| `Share` |
|
|
773
|
+
| `Share` | 正常显示(开放只读查看) | **隐藏** | **隐藏**(多选模式) | 分享预览模式;开放流程智能体侧栏详情/证据/执行情况与耗时,仅隐藏「重试/跳过」等交互 |
|
|
769
774
|
| `Test` | 正常显示 | 正常显示 | 过滤掉「分享」按钮 | 测试/嵌入模式,隐藏分享入口 |
|
|
770
775
|
|
|
771
776
|
```vue
|
|
@@ -864,5 +869,5 @@ interface Shortcut {
|
|
|
864
869
|
- [SelectionFooter](/components/input/selection-footer) — 多选操作栏
|
|
865
870
|
- [ToolBtn](/components/feedback/tool-btn) — 侧栏全屏按钮
|
|
866
871
|
- [useFullScreen](/composables/use-full-screen) — 侧栏全屏控制
|
|
867
|
-
- [useGlobalConfig](/composables/use-global-config) — 注入 `size` 与 `
|
|
872
|
+
- [useGlobalConfig](/composables/use-global-config) — 注入 `size`、`supportUpload` 与 `timezone`
|
|
868
873
|
- [主题配置](/theme/theme) — 字号主题 CSS 变量
|
|
@@ -654,19 +654,11 @@ const handleSendMessage = async (
|
|
|
654
654
|
|
|
655
655
|
## 类型定义
|
|
656
656
|
|
|
657
|
+
> `MessageStatus` 完整取值见 [常量枚举](../../types/constants)。与输入区相关:`pending` / `streaming` / `fetching` → 停止按钮;`complete` / `completed` / `error` / `stop` → 发送;`disabled` → 置灰。
|
|
658
|
+
|
|
657
659
|
```typescript
|
|
658
660
|
import type { UserMessage } from '@blueking/chat-x';
|
|
659
661
|
|
|
660
|
-
// 消息状态
|
|
661
|
-
enum MessageStatus {
|
|
662
|
-
Pending = 'pending', // 等待中(显示停止按钮)
|
|
663
|
-
Streaming = 'streaming', // 流式输出中(显示停止按钮)
|
|
664
|
-
Complete = 'complete', // 完成(显示发送按钮)
|
|
665
|
-
Error = 'error', // 错误(显示发送按钮)
|
|
666
|
-
Stop = 'stop', // 已停止(显示发送按钮)
|
|
667
|
-
Disabled = 'disabled', // 禁用(发送按钮置灰)
|
|
668
|
-
}
|
|
669
|
-
|
|
670
662
|
// 上传状态
|
|
671
663
|
enum UploadStatus {
|
|
672
664
|
Pending = 'pending', // 上传中
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- AI SUMMARY -->
|
|
2
2
|
## 快速了解
|
|
3
3
|
|
|
4
|
-
汇总 MessageRole、MessageStatus(含 Fetching
|
|
4
|
+
汇总 MessageRole、MessageStatus(含 Fetching 请求中、Complete/Completed 完成态兼容)、MessageContentType、MessageToolsStatus、MessageState、Z-Index 与 CONST_MESSAGE_TOOLS 等导出常量。 用于构造消息、配置 MessageContainer 工具栏与输入态,以及层级与默认快捷指令。与类型 messages 配套使用。
|
|
5
5
|
|
|
6
6
|
### 关联组件
|
|
7
7
|
- **message-tools** — 默认工具 ID 与展示
|
|
@@ -58,6 +58,7 @@ enum MessageRole {
|
|
|
58
58
|
```typescript
|
|
59
59
|
enum MessageStatus {
|
|
60
60
|
Complete = 'complete',
|
|
61
|
+
Completed = 'completed', // 与 Complete 同为完成态,兼容后端/协议返回的 completed
|
|
61
62
|
Disabled = 'disabled',
|
|
62
63
|
Error = 'error',
|
|
63
64
|
Fetching = 'fetching', // 请求中(例如已发用户消息、尚未开始流式,与末尾 Loading 占位一致)
|
|
@@ -71,6 +72,7 @@ enum MessageStatus {
|
|
|
71
72
|
|
|
72
73
|
| 枚举值 | 说明 |
|
|
73
74
|
| --------------- | ---- |
|
|
75
|
+
| `Complete` / `Completed` | 已完成。`complete` 为库内常用值;`completed` 与之语义相同,用于兼容外部协议或后端返回。`ToolcallRender` 等将二者与 `success` 一并视为成功态。 |
|
|
74
76
|
| `Fetching` | 请求中:与 `useMessageGroup` 在末尾用户消息后注入的 Loading 占位(`LOADING_MESSAGE_ID`)配合时,`ChatContainer` 会将传入输入区与列表底部的状态推导为该值,便于展示「停止」与禁止重复发送。 |
|
|
75
77
|
|
|
76
78
|
### InterruptReason
|
|
@@ -216,18 +216,10 @@ enum MessageContentType {
|
|
|
216
216
|
KnowledgeRag = 'knowledge_rag',
|
|
217
217
|
Other = 'other',
|
|
218
218
|
}
|
|
219
|
-
|
|
220
|
-
// 消息状态
|
|
221
|
-
enum MessageStatus {
|
|
222
|
-
Pending = 'pending',
|
|
223
|
-
Streaming = 'streaming',
|
|
224
|
-
Complete = 'complete',
|
|
225
|
-
Error = 'error',
|
|
226
|
-
Stop = 'stop',
|
|
227
|
-
Disabled = 'disabled',
|
|
228
|
-
}
|
|
229
219
|
```
|
|
230
220
|
|
|
221
|
+
> `MessageStatus` 完整取值见 [常量枚举](../../types/constants);本组件主要关心 `error`(错误内容)与流式相关状态。
|
|
222
|
+
|
|
231
223
|
## 使用场景
|
|
232
224
|
|
|
233
225
|
- **AI 文本回复渲染**:`AssistantMessage` 内部用 `ContentRender` 渲染 AI 回复内容,`status` 配合流式响应
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
|
|
63
63
|
```
|
|
64
64
|
ai-execution-summary
|
|
65
|
-
├── ai-execution-summary-header
|
|
65
|
+
├── ai-execution-summary-header(仅 messageGroups 非空时渲染)
|
|
66
66
|
│ └── Input(关键词搜索框,clearable)
|
|
67
67
|
└── ai-execution-summary-content
|
|
68
68
|
├── 有数据时:
|
|
@@ -73,12 +73,12 @@ ai-execution-summary
|
|
|
73
73
|
│ ├── content-item-messages(MessageRender × N)
|
|
74
74
|
│ └── timeline-line(连接线,最后一项不显示)
|
|
75
75
|
└── 无数据时:
|
|
76
|
-
└── Exception
|
|
76
|
+
└── Exception(scene="part")+「暂无数据」/「搜索结果为空」文案(有关键词时附带「清空搜索」)
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
## 空状态
|
|
80
80
|
|
|
81
|
-
当 `messageGroups`
|
|
81
|
+
当 `messageGroups` 为空数组时,**不渲染搜索 header**,内容区整块展示空态(bkui `Exception` +「暂无数据」;若仍有搜索关键词则为「搜索结果为空」并提供「清空搜索」):
|
|
82
82
|
|
|
83
83
|
## 与 ChatContainer 配合
|
|
84
84
|
|