@blueking/chat-x 2.4.0 → 3.0.0-beta.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/dist/ag-ui/types/messages.d.ts +1 -1
- package/dist/components/chat-content/flow-agent-content/flow-agent-state.d.ts +24 -7
- package/dist/components/chat-content/flow-agent-content/use-flow-agent.d.ts +6 -1
- package/dist/components/chat-input/chat-input.vue.d.ts +5 -2
- package/dist/components/chat-message/user-message/user-message.vue.d.ts +1 -0
- package/dist/components/image-preview/image.vue.d.ts +2 -2
- package/dist/composables/use-global-config.d.ts +8 -0
- package/dist/composables/use-message-group.d.ts +3 -3
- package/dist/icons/execution.d.ts +4 -0
- package/dist/index.css +1 -1
- package/dist/index.js +2464 -2386
- package/dist/index.js.map +1 -1
- package/dist/lang/lang.d.ts +2 -1
- package/dist/mcp/generated/docs/activity-message.md +15 -13
- package/dist/mcp/generated/docs/assistant-message.md +3 -2
- package/dist/mcp/generated/docs/chat-container.md +4 -4
- package/dist/mcp/generated/docs/chat-input.md +4 -3
- package/dist/mcp/generated/docs/flow-agent-content.md +19 -14
- package/dist/mcp/generated/docs/messages.md +1 -1
- package/dist/mcp/generated/docs/toolcall-render.md +9 -9
- package/dist/mcp/generated/docs/use-global-config.md +14 -5
- package/dist/mcp/generated/docs/user-message.md +7 -4
- package/dist/mcp/generated/index.json +3 -3
- package/package.json +2 -2
- package/skills/blueking-chat-x/references/components/activity-message.md +15 -13
- package/skills/blueking-chat-x/references/components/assistant-message.md +3 -2
- package/skills/blueking-chat-x/references/components/flow-agent-content.md +14 -10
- package/skills/blueking-chat-x/references/components/toolcall-render.md +9 -9
- package/skills/blueking-chat-x/references/types/messages.md +1 -1
package/dist/lang/lang.d.ts
CHANGED
|
@@ -55,6 +55,7 @@ export declare const lang: {
|
|
|
55
55
|
readonly 执行中: "Running";
|
|
56
56
|
readonly 成功: "Success";
|
|
57
57
|
readonly 失败: "Failed";
|
|
58
|
+
readonly 已终止: "Terminated";
|
|
58
59
|
readonly 挂起: "Pending";
|
|
59
60
|
readonly 待执行: "To Be Executed";
|
|
60
61
|
readonly 详情: "Details";
|
|
@@ -173,4 +174,4 @@ export declare const lang: {
|
|
|
173
174
|
readonly '\u5B58\u5728\u4E0A\u4F20\u5931\u8D25\u7684\u6587\u4EF6\uFF0C\u8BF7\u5220\u9664\u540E\u91CD\u8BD5': "Remove failed uploads before sending";
|
|
174
175
|
readonly 上传失败: "Upload failed";
|
|
175
176
|
};
|
|
176
|
-
export declare const t: (key: keyof typeof lang) => "Send" | "Stop" | "Add" | "Skill" | "MCP" | "Prompt" | "File" | "Image" | "Tool" | "Knowledge Base" | "Conversation Files" | "Collapse" | "Show More" | "Ask AI" | "Copy" | "Share" | "Like" | "Unsatisfied" | "Delete" | "Quote" | "Regenerate" | "Regenerating will clear the content below" | "Submit" | "Cancel" | "Preview Content" | "Jump to Detail" | "Call Tool" | "Read Skill" | "Calling" | "Reading" | "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 file, up to {count} files, max {size}MB each" | "Supported formats: {formats}" | "{count} file(s) were not added because the format is not supported" | "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" | "Uploading files, please wait" | "Remove failed uploads before sending" | "Upload failed" | "发送" | "停止" | "添加" | "文件" | "图片" | "工具" | "知识库" | "会话产物" | "收起" | "显示更多" | "问问小鲸" | "复制" | "分享" | "点赞" | "不满意" | "删除" | "引用" | "重新生成" | "重新生成将清空下文内容" | "提交" | "取消" | "预览内容" | "跳转详情" | "调用工具" | "读取 Skill" | "正在调用" | "正在读取" | "说出您的想法" | "什么原因让你满意?" | "什么原因让你不满意?" | "返回内容" | "编辑" | "深度思考" | "快速思考" | "图生文" | "图片加载中..." | "图片加载失败" | "思考中" | "已思考完成" | "思考失败" | "复制成功" | "复制失败" | "返回底部" | "停止生成" | "正在停止" | "耗时" | "昨天" | "参数" | "描述" | "执行情况" | "执行中" | "成功" | "失败" | "挂起" | "待执行" | "详情" | "重试" | "重试中" | "跳过中" | "任务正在重试中,不可跳过" | "任务正在跳过中,不可重试" | "节点" | "节点配置" | "节点输出" | "基础信息" | "流程模板" | "节点名称" | "步骤名称" | "执行方案" | "是否可选" | "失败处理" | "超时控制" | "是" | "否" | "输入参数" | "输出参数" | "参数名" | "参数值" | "名称" | "变量说明" | "结构化输出" | "手动跳过" | "暂无数据" | "调用 MCP" | "更多" | "算法方案评审单" | "评审中" | "审批中" | "已废弃" | "已批准" | "已通过" | "已取消" | "已过期" | "已拒绝" | "已撤销" | "单据编号" | "提交时间" | "当前处理人" | "无" | "查看单据详情" | "复制单据" | "复制单据链接" | "取消审批" | "已取消审批" | "刷新单据状态" | "单据已取消审批" | "该单据已被拒绝,无法取消" | "该单据已通过,无法取消" | "单据已取消,无需重复点击" | "当前状态无法取消审批" | "当前会话有 {count} 个待审批单,如需继续,请先取消审批" | "暂不支持的中断消息" | "检索中" | "检索完成" | "上传文件" | "选择模型" | "搜索模型关键字" | "请求中..." | "取消满意" | "取消不满意" | "确认删除该回答?" | "删除操作无法撤回,请谨慎操作!" | "预览" | "缩小" | "放大" | "旋转" | "下载" | "抱歉,图片加载失败,可尝试重新加载" | "重置" | "重新加载" | "宽" | "高" | "上传图片" | "搜索 关键字" | "选择日期" | "在对话中定位" | "全选" | "确定" | "上传文件,最多支持 {count} 个,单个最大 {size}MB" | "支持格式:{formats}" | "有 {count} 个文件因格式不支持未添加" | "你好,我是小鲸" | "清空搜索" | "搜索结果为空" | "有效证据" | "全屏" | "退出全屏" | "请选择以继续" | "继续" | "收到信息:" | "待审批" | "已审批" | "完成" | "跳过" | "单选" | "多选" | "其他" | "已完成" | "题" | "回答内容" | "已回复" | "请输入..." | "文件产物" | "文件列表" | "搜索文件关键字" | "预览加载失败" | "暂无可预览的文件" | "文件上传中,请稍候" | "存在上传失败的文件,请删除后重试" | "上传失败";
|
|
177
|
+
export declare const t: (key: keyof typeof lang) => "Send" | "Stop" | "Add" | "Skill" | "MCP" | "Prompt" | "File" | "Image" | "Tool" | "Knowledge Base" | "Conversation Files" | "Collapse" | "Show More" | "Ask AI" | "Copy" | "Share" | "Like" | "Unsatisfied" | "Delete" | "Quote" | "Regenerate" | "Regenerating will clear the content below" | "Submit" | "Cancel" | "Preview Content" | "Jump to Detail" | "Call Tool" | "Read Skill" | "Calling" | "Reading" | "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" | "Terminated" | "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 file, up to {count} files, max {size}MB each" | "Supported formats: {formats}" | "{count} file(s) were not added because the format is not supported" | "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" | "Uploading files, please wait" | "Remove failed uploads before sending" | "Upload failed" | "发送" | "停止" | "添加" | "文件" | "图片" | "工具" | "知识库" | "会话产物" | "收起" | "显示更多" | "问问小鲸" | "复制" | "分享" | "点赞" | "不满意" | "删除" | "引用" | "重新生成" | "重新生成将清空下文内容" | "提交" | "取消" | "预览内容" | "跳转详情" | "调用工具" | "读取 Skill" | "正在调用" | "正在读取" | "说出您的想法" | "什么原因让你满意?" | "什么原因让你不满意?" | "返回内容" | "编辑" | "深度思考" | "快速思考" | "图生文" | "图片加载中..." | "图片加载失败" | "思考中" | "已思考完成" | "思考失败" | "复制成功" | "复制失败" | "返回底部" | "停止生成" | "正在停止" | "耗时" | "昨天" | "参数" | "描述" | "执行情况" | "执行中" | "成功" | "失败" | "已终止" | "挂起" | "待执行" | "详情" | "重试" | "重试中" | "跳过中" | "任务正在重试中,不可跳过" | "任务正在跳过中,不可重试" | "节点" | "节点配置" | "节点输出" | "基础信息" | "流程模板" | "节点名称" | "步骤名称" | "执行方案" | "是否可选" | "失败处理" | "超时控制" | "是" | "否" | "输入参数" | "输出参数" | "参数名" | "参数值" | "名称" | "变量说明" | "结构化输出" | "手动跳过" | "暂无数据" | "调用 MCP" | "更多" | "算法方案评审单" | "评审中" | "审批中" | "已废弃" | "已批准" | "已通过" | "已取消" | "已过期" | "已拒绝" | "已撤销" | "单据编号" | "提交时间" | "当前处理人" | "无" | "查看单据详情" | "复制单据" | "复制单据链接" | "取消审批" | "已取消审批" | "刷新单据状态" | "单据已取消审批" | "该单据已被拒绝,无法取消" | "该单据已通过,无法取消" | "单据已取消,无需重复点击" | "当前状态无法取消审批" | "当前会话有 {count} 个待审批单,如需继续,请先取消审批" | "暂不支持的中断消息" | "检索中" | "检索完成" | "上传文件" | "选择模型" | "搜索模型关键字" | "请求中..." | "取消满意" | "取消不满意" | "确认删除该回答?" | "删除操作无法撤回,请谨慎操作!" | "预览" | "缩小" | "放大" | "旋转" | "下载" | "抱歉,图片加载失败,可尝试重新加载" | "重置" | "重新加载" | "宽" | "高" | "上传图片" | "搜索 关键字" | "选择日期" | "在对话中定位" | "全选" | "确定" | "上传文件,最多支持 {count} 个,单个最大 {size}MB" | "支持格式:{formats}" | "有 {count} 个文件因格式不支持未添加" | "你好,我是小鲸" | "清空搜索" | "搜索结果为空" | "有效证据" | "全屏" | "退出全屏" | "请选择以继续" | "继续" | "收到信息:" | "待审批" | "已审批" | "完成" | "跳过" | "单选" | "多选" | "其他" | "已完成" | "题" | "回答内容" | "已回复" | "请输入..." | "文件产物" | "文件列表" | "搜索文件关键字" | "预览加载失败" | "暂无可预览的文件" | "文件上传中,请稍候" | "存在上传失败的文件,请删除后重试" | "上传失败";
|
|
@@ -160,12 +160,12 @@ const collapsed = ref(false); // false = 展开,true = 折叠
|
|
|
160
160
|
|
|
161
161
|
### 核心交互
|
|
162
162
|
|
|
163
|
-
- **标题栏**:显示「执行情况」+ 所有任务聚合后的各状态计数(执行中 / 成功 / 失败 /
|
|
163
|
+
- **标题栏**:显示「执行情况」+ 所有任务聚合后的各状态计数(执行中 / 成功 / 失败 / 挂起 / 已终止 / 待执行 / 跳过),颜色区分。任一任务 `task_state === REVOKED` 时前置橙红色「已终止」并用括号包裹统计
|
|
164
164
|
- **任务组**:逐个展示任务行,带状态图标、总耗时;点击箭头图标可折叠/展开节点列表
|
|
165
165
|
- **有效证据**:`task.has_confidence === true` 时,任务行右侧展示「有效证据」按钮,点击后在侧栏打开置信度/证据详情 Tab(`props.has_confidence: true`)
|
|
166
166
|
- **默认激活**:当 `MessageContainer` 已注入滚动上下文(`useContainerScrollProvider`,供 `FlowAgentContent` 内 `useContainerScrollConsumer` 读取)时,组件挂载后若存在 `task.is_active === true` 且 `task.has_confidence === true` 的任务,会自动在侧栏打开该任务的「有效证据」Tab;无滚动 Provider(例如独立演示)时不做自动打开。用户手动切换 Tab 后不再沿用 `is_active` 默认高亮
|
|
167
167
|
- **选中态**:当前侧栏 Tab 与任务行 / 节点行联动高亮(`is-selected`);任务 Tab 与「有效证据」Tab 均视为该任务的选中态
|
|
168
|
-
-
|
|
168
|
+
- **节点列表**:每个节点显示状态圆点、名称和耗时;`REVOKED` 叶子节点使用已终止圆点(`#F55B0E` 描边 / `#FEE8DD` 浅底);hover 时出现行尾操作按钮组
|
|
169
169
|
- **失败节点操作**:失败且 `retryable` / `skippable` 为 `true` 的节点,hover 时额外展示「重试」「跳过」按钮,点击后通过 `onInterruptResume` 回传 Agent(不传 `interrupt`)。仅在对话流内出现:侧栏「执行情况」面板(`ExecutionSummary`)内渲染的同一消息只保留「详情」
|
|
170
170
|
- **节点详情**:点击「详情」会通过 `useCustomTabConsumer` 在 `ChatContainer` 侧边栏新增自定义 Tab,展示节点配置(基础信息、输入参数、输出参数)
|
|
171
171
|
|
|
@@ -178,11 +178,11 @@ FlowAgentContent(activityType = 'flow_agent')
|
|
|
178
178
|
├── ActivityLayout(公共折叠布局容器)
|
|
179
179
|
│ └── #title
|
|
180
180
|
│ ├── Loading / ArrowIcon(随 status 切换)
|
|
181
|
-
│ └──
|
|
181
|
+
│ └── 执行情况:[已终止(] 执行中 N / 成功 N / 失败 N / 挂起 N / 已终止 N [)]
|
|
182
182
|
└── #default
|
|
183
183
|
└── TaskGroup × N
|
|
184
184
|
├── TaskHeader(is-selected / has-confidence;箭头点击折叠)
|
|
185
|
-
│ ├── 状态图标(running=Loading / success / failed / suspended)
|
|
185
|
+
│ ├── 状态图标(running=Loading / success / failed / terminated / suspended)
|
|
186
186
|
│ ├── task_name(HighlightKeyword 支持搜索高亮)
|
|
187
187
|
│ └── trailing:总耗时 + 「有效证据」(has_confidence 时)
|
|
188
188
|
└── NodeList
|
|
@@ -318,15 +318,17 @@ const messages = [
|
|
|
318
318
|
|
|
319
319
|
### 节点状态映射
|
|
320
320
|
|
|
321
|
-
组件内部将 BkFlow
|
|
322
|
-
|
|
323
|
-
| 归并状态
|
|
324
|
-
|
|
|
325
|
-
| `running`
|
|
326
|
-
| `success`
|
|
327
|
-
| `failed`
|
|
328
|
-
| `suspended`
|
|
329
|
-
| `
|
|
321
|
+
组件内部将 BkFlow 原始状态归并为收敛显示状态:
|
|
322
|
+
|
|
323
|
+
| 归并状态 | 原始状态 | 颜色 | 统计 | 整体 header |
|
|
324
|
+
| ------------ | ----------------------------------------------------------------------------------- | --------- | ---- | ----------- |
|
|
325
|
+
| `running` | CREATED / LOOP_READY / READY / RUNNING / BLOCKED / ROLLING_BACK / ROLL_BACK_SUCCESS | #3A84FF | 是 | 否 |
|
|
326
|
+
| `success` | FINISHED | #65C389 | 是 | 否 |
|
|
327
|
+
| `failed` | FAILED / ROLL_BACK_FAILED | #EA3636 | 是 | 否 |
|
|
328
|
+
| `suspended` | SUSPENDED | #F59500 | 是 | 否 |
|
|
329
|
+
| `terminated` | REVOKED | #F55B0E | 是 | 是 |
|
|
330
|
+
| `pending` | PENDING | #4D4F56 | 是 | 否 |
|
|
331
|
+
| `skipped` | SKIPPED | #5B7290 | 是 | 否 |
|
|
330
332
|
|
|
331
333
|
### 侧栏 Tab 命名规则
|
|
332
334
|
|
|
@@ -200,7 +200,7 @@ AI 可在一次回复中发起多个工具调用,组件依次渲染:
|
|
|
200
200
|
|
|
201
201
|
### MCP 工具调用
|
|
202
202
|
|
|
203
|
-
`function.
|
|
203
|
+
`function.function_type` 为 `'mcp'`(或旧数据仅有 `mcpName`)时,`ToolCallRender` 头部显示为「调用 MCP {mcpName} / {name}」:
|
|
204
204
|
|
|
205
205
|
```vue
|
|
206
206
|
<script setup lang="ts">
|
|
@@ -209,7 +209,7 @@ AI 可在一次回复中发起多个工具调用,组件依次渲染:
|
|
|
209
209
|
id: 'call_mcp_1',
|
|
210
210
|
type: 'function',
|
|
211
211
|
function: {
|
|
212
|
-
|
|
212
|
+
function_type: 'mcp', // 调用类型,缺省时有 mcpName 也会兼容判定为 MCP
|
|
213
213
|
name: 'query_database',
|
|
214
214
|
arguments: '{"sql": "SELECT * FROM users LIMIT 10"}',
|
|
215
215
|
description: '执行数据库查询',
|
|
@@ -482,6 +482,7 @@ type FunctionCall = {
|
|
|
482
482
|
arguments: string; // JSON 字符串格式的参数
|
|
483
483
|
description?: string; // 函数描述
|
|
484
484
|
mcpName?: string; // MCP 服务名(存在时标题显示 "调用 MCP")
|
|
485
|
+
function_type?: 'function' | 'mcp' | 'skill'; // 调用类型,决定头部前缀;不传时有 mcpName 按 MCP 判定
|
|
485
486
|
};
|
|
486
487
|
|
|
487
488
|
// 工具执行结果
|
|
@@ -550,7 +550,7 @@ ai-chat-container(:data-ai-size="size")
|
|
|
550
550
|
|
|
551
551
|
## 分享模式
|
|
552
552
|
|
|
553
|
-
|
|
553
|
+
点击消息工具栏的「分享」按钮后进入分享模式,并默认勾选当前轮次;底部出现 `SelectionFooter` 操作栏:
|
|
554
554
|
|
|
555
555
|
```vue
|
|
556
556
|
<template>
|
|
@@ -618,7 +618,7 @@ ai-chat-container(:data-ai-size="size")
|
|
|
618
618
|
**分享流程**:
|
|
619
619
|
|
|
620
620
|
1. 用户点击消息工具栏中的「分享」按钮(或任意 `triggerSelection: true` 的自定义按钮)
|
|
621
|
-
2.
|
|
621
|
+
2. 进入多选模式,并默认勾选当前轮次(用户问题 + 对应回复);`enterShareMode()` 进入时不预选
|
|
622
622
|
3. 底部 `SelectionFooter` 提供全选、取消、确认操作
|
|
623
623
|
4. 确认后触发 `confirmShare` 事件,携带选中的消息列表与触发按钮对象(`source`)
|
|
624
624
|
|
|
@@ -630,7 +630,7 @@ ai-chat-container(:data-ai-size="size")
|
|
|
630
630
|
|
|
631
631
|
**2. 资源引用入口**:容器通过 [useInputMention](/composables/use-input-mention) 提供 `insertMention`,消息区的文件卡片与侧栏产物面板因此能直接把文件「@ 进输入框」,无需逐层透传输入框实例。没有输入框的场景(`Share` 只读态)自动不显示引用按钮。
|
|
632
632
|
|
|
633
|
-
**3.
|
|
633
|
+
**3. 编辑态菜单与上传下发**:`menuSources` 经 [useGlobalConfig](/composables/use-global-config) 注入,用户消息进入编辑态时就地渲染的 `ChatInput` 也能拿到同一份数据源。`supportUpload` 同样下发,编辑态输入框也会出现内置「文件」项。主输入框的 `onUpload` 与 `deleteFile` 一并注入,编辑态新选文件会走同一套 upload / DELETE,无需再向 `UserMessage` 透传。
|
|
634
634
|
|
|
635
635
|
```vue
|
|
636
636
|
<template>
|
|
@@ -804,7 +804,7 @@ ChatContainer 的 Props 继承自 `ChatInputProps` 和 `MessageContainerProps`
|
|
|
804
804
|
| addCustomTab | `(tab: CustomTab) => void` | 添加自定义 Tab |
|
|
805
805
|
| removeCustomTab | `(tabName: string) => void` | 移除自定义 Tab |
|
|
806
806
|
| selectCustomTab | `(tab: CustomTab) => void` | 切换到指定 Tab |
|
|
807
|
-
| enterShareMode | `() => void` |
|
|
807
|
+
| enterShareMode | `() => void` | 手动进入分享多选模式(不预选消息) |
|
|
808
808
|
| exitShareMode | `() => void` | 退出分享多选模式,并清空已选消息 |
|
|
809
809
|
|
|
810
810
|
## 渲染模式
|
|
@@ -44,7 +44,7 @@ ai-chat-input-container(padding: 0 16px 16px)
|
|
|
44
44
|
└── slot#send-icon(默认:发送 / 停止图标)
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
> `slot#attachment` 只替换快捷指令区,`AddMenuBtn` 在其外部,使用该插槽不会移除 + 号。`slot#send-icon`
|
|
47
|
+
> `slot#attachment` 只替换快捷指令区,`AddMenuBtn` 在其外部,使用该插槽不会移除 + 号。`slot#send-icon` 替换发送区;未传入时仍用默认发送 / 停止图标。自定义该插槽时需自行处理禁用,作用域参数 `sendDisabledTip` 为上传中 / 失败等拦截文案。
|
|
48
48
|
|
|
49
49
|
## 基础用法
|
|
50
50
|
|
|
@@ -527,7 +527,7 @@ const defaultFiles: UploadFile[] = [
|
|
|
527
527
|
| files | `{ files: Partial<UploadFile>[] }` | 文件预览区 |
|
|
528
528
|
| attachment | - | 底部快捷指令区,`AddMenuBtn` 在其左侧,不受此插槽影响 |
|
|
529
529
|
| model-selector | `{ models: IModelOption[]; selectedModel: string \| undefined }` | 发送按钮左侧模型选择区,默认渲染 `ModelSelector` |
|
|
530
|
-
| send-icon |
|
|
530
|
+
| send-icon | `{ sendDisabledTip?: string }` | 替换发送区;自定义时需自行处理禁用,拦截文案见 `sendDisabledTip` |
|
|
531
531
|
|
|
532
532
|
### Expose
|
|
533
533
|
|
|
@@ -537,7 +537,8 @@ const defaultFiles: UploadFile[] = [
|
|
|
537
537
|
| ------------------ | --------------------------------- | ------------------------------------------------ |
|
|
538
538
|
| focus | `() => void` | 聚焦编辑器并把光标置于末尾 |
|
|
539
539
|
| insertMention | `(item: IInputMenuItem) => void` | 把条目以标签形式追加到文档末尾(不依赖当前光标) |
|
|
540
|
-
|
|
|
540
|
+
| getUploadFiles | `() => Partial<UploadFile>[]` | 当前待发送附件快照(编辑态取消时据此清理本次新文件) |
|
|
541
|
+
| triggerSendMessage | `() => Promise<boolean>` | 手动触发发送;真正发出返回 `true`,上传中/失败拦截返回 `false` |
|
|
541
542
|
| uploadedArtifacts | `AIFileInfo[]` | 已上传且带 `outputId` 的附件列表(只读) |
|
|
542
543
|
|
|
543
544
|
## 键盘快捷键
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
|
|
31
31
|
## 核心能力
|
|
32
32
|
|
|
33
|
-
- **状态聚合统计**:汇总所有任务的 `statistics.state_counts`,在标题栏按「执行中 / 成功 / 失败 / 挂起 /
|
|
33
|
+
- **状态聚合统计**:汇总所有任务的 `statistics.state_counts`,在标题栏按「执行中 / 成功 / 失败 / 挂起 / 已终止 / 待执行 / 跳过」分类展示带颜色的计数(超过 99 显示 `99+`)
|
|
34
|
+
- **已终止整体覆盖**:任一任务 `task_state === REVOKED` 时,标题栏在统计前展示橙红色「已终止」,并用括号包裹统计:`执行情况:已终止(…)`;任务行使用终止图标,叶子节点使用已终止圆点(`#F55B0E` 描边 / `#FEE8DD` 浅底)
|
|
34
35
|
- **两级折叠**:任务整体由 `ActivityLayout` 折叠;每个任务节点列表可单独展开/收起
|
|
35
36
|
- **耗时格式化**:节点耗时与任务总耗时按 `d/h/m/s` 紧凑展示,小于 1 秒显示 `<1s`
|
|
36
37
|
- **节点行尾操作**:hover 失败节点行显示「重试 / 跳过 / 详情」按钮组(间距 12px);成功 / 运行中等非失败节点仅显示「详情」。重试 / 跳过依赖节点 `retryable` / `skippable` 能力位,通过 `onInterruptResume` 回传 Agent
|
|
@@ -41,15 +42,17 @@
|
|
|
41
42
|
|
|
42
43
|
## 状态映射
|
|
43
44
|
|
|
44
|
-
组件将后端原始 `state` / `task_state`
|
|
45
|
+
组件将后端原始 `state` / `task_state` 归一为收敛状态(`getConvergedState`),用于图标、颜色与统计分类。配置源为 `STATE_DEFS`:
|
|
45
46
|
|
|
46
|
-
| 收敛状态
|
|
47
|
-
|
|
|
48
|
-
| `
|
|
49
|
-
| `
|
|
50
|
-
| `
|
|
51
|
-
| `
|
|
52
|
-
| `
|
|
47
|
+
| 收敛状态 | 颜色 | 原始状态 | 统计 | 整体 header |
|
|
48
|
+
| ------------- | ----------- | --------------------------------------------------------------------------------- | ---- | ----------- |
|
|
49
|
+
| `running` | `#3A84FF` | `CREATED`、`LOOP_READY`、`READY`、`RUNNING`、`BLOCKED`、`ROLLING_BACK`、`ROLL_BACK_SUCCESS` 及未知状态(兜底) | 是 | 否 |
|
|
50
|
+
| `success` | `#65C389` | `FINISHED` | 是 | 否 |
|
|
51
|
+
| `failed` | `#EA3636` | `FAILED`、`ROLL_BACK_FAILED` | 是 | 否 |
|
|
52
|
+
| `suspended` | `#F59500` | `SUSPENDED` | 是 | 否 |
|
|
53
|
+
| `terminated` | `#F55B0E` | `REVOKED` | 是 | 是 |
|
|
54
|
+
| `pending` | `#4D4F56` | `PENDING` | 是 | 否 |
|
|
55
|
+
| `skipped` | `#5B7290` | `SKIPPED` | 是 | 否 |
|
|
53
56
|
|
|
54
57
|
## 基础用法
|
|
55
58
|
|
|
@@ -167,7 +170,8 @@ addCustomTab?.({
|
|
|
167
170
|
ActivityLayout(activity-type=flow_agent,v-model:collapsed)
|
|
168
171
|
├── #title(执行情况统计栏)
|
|
169
172
|
│ ├── AiLoading / ArrowRightIcon(加载态 / 折叠箭头)
|
|
170
|
-
│
|
|
173
|
+
│ ├── flow-agent-flow-header(任一任务 REVOKED 时展示「已终止」)
|
|
174
|
+
│ └── flow-agent-stat-item × N(按收敛状态分类的计数,含 terminated)
|
|
171
175
|
└── flow-agent-task-group × N(任务)
|
|
172
176
|
├── flow-agent-task-header(点击折叠当前任务)
|
|
173
177
|
│ ├── task-arrow(任务展开箭头)
|
|
@@ -261,10 +265,11 @@ interface BkFlowNode {
|
|
|
261
265
|
3. **任务总耗时为节点累加**:`task-time` 由各节点 `elapsed_time` 求和得到,并非任务级独立字段。
|
|
262
266
|
4. **`task_outputs` 暂不渲染**:模板中任务输出展示区块已注释,传入也不会显示。
|
|
263
267
|
5. **未知状态兜底为 `running`**:`getConvergedState` 对未识别的原始状态统一归为运行中。
|
|
264
|
-
6.
|
|
265
|
-
7.
|
|
266
|
-
8.
|
|
267
|
-
9.
|
|
268
|
+
6. **已终止整体覆盖**:判定只看任务 `task_state`(不扫节点);叶子节点 `state === REVOKED` 使用已终止圆点;`REVOKED` 计入标题栏 / tooltip 统计,与叶子节点同色 `#F55B0E`。
|
|
269
|
+
7. **Share 模式只读查看**:`RenderMode.Share` 下保留节点/任务耗时与「详情」「有效证据」查看入口,仅过滤「重试 / 跳过」等交互式 resume 操作(由 `useFlowNodeActions` 的 `hideResumeActions` 收敛)。
|
|
270
|
+
8. **侧栏「执行情况」面板同为只读**:面板内经 `ExecutionSummary` → `MessageRender` 渲染的本组件不展示「重试 / 跳过」,只保留「详情」;判定来自 `useExecutionPanelInject()`(内部上下文,未从包入口导出;缺省 `false`),与 Share 态一起并入 `hideResumeActions`。因此脱离 `ExecutionSummary` 独立使用组件时,行为与对话流内一致。
|
|
271
|
+
9. **`onInterruptResume` 透传链路**:`MessageRender` → `ActivityMessage` → `FlowAgentContent`;未传入时重试 / 跳过按钮仍展示但点击无回调。
|
|
272
|
+
10. **pending 自动收敛**:`useFlowNodeActions` 以 `task_id:node_id:retry` 为 pending 键;节点重试再次失败(`retry` +1)后键变化,进行中态自动解除,无需手动清理。
|
|
268
273
|
|
|
269
274
|
## 关联组件
|
|
270
275
|
|
|
@@ -104,20 +104,20 @@ isPending = !isSuccess && !isError; // 其余(含 pending / streaming / stop /
|
|
|
104
104
|
|
|
105
105
|
## 调用类型前缀
|
|
106
106
|
|
|
107
|
-
非进行中态的前缀由 `function.
|
|
107
|
+
非进行中态的前缀由 `function.function_type` 决定;进行中态工具 / MCP 显示「正在调用」,Skill 显示「正在读取」:
|
|
108
108
|
|
|
109
|
-
| `function.
|
|
109
|
+
| `function.function_type` | 前缀 | 说明 |
|
|
110
110
|
| ------------------------ | ----------- | ---------------------------------------- |
|
|
111
111
|
| `'function'` / 不传 | 调用工具 | 普通函数调用 |
|
|
112
112
|
| `'mcp'` | 调用 MCP | MCP 调用,通常同时带 `mcpName` |
|
|
113
113
|
| `'skill'` | 读取 Skill | Skill 读取 |
|
|
114
114
|
|
|
115
115
|
```typescript
|
|
116
|
-
const callType = fn?.
|
|
116
|
+
const callType = fn?.function_type ?? (fn?.mcpName ? 'mcp' : 'function');
|
|
117
117
|
```
|
|
118
118
|
|
|
119
|
-
- **旧数据兼容**:未下发 `
|
|
120
|
-
- **`
|
|
119
|
+
- **旧数据兼容**:未下发 `function_type` 时,有 `mcpName` 仍按 MCP 判定,历史消息展示不变
|
|
120
|
+
- **`function_type` 优先**:显式 `function_type: 'function'` 不会被 `mcpName` 覆盖回 MCP,但标题仍是 `{mcpName} / {name}`
|
|
121
121
|
|
|
122
122
|
**三种前缀对比**
|
|
123
123
|
|
|
@@ -194,14 +194,14 @@ const toolCallWithDuration: ToolCall = {
|
|
|
194
194
|
|
|
195
195
|
## MCP 调用
|
|
196
196
|
|
|
197
|
-
`function.
|
|
197
|
+
`function.function_type` 为 `'mcp'`(或旧数据仅有 `mcpName`)时,前缀为「调用 MCP」,标题格式变为 `{mcpName} / {functionName}`:
|
|
198
198
|
|
|
199
199
|
```typescript
|
|
200
200
|
const mcpToolCall: ToolCall = {
|
|
201
201
|
id: 'call_mcp_1',
|
|
202
202
|
type: 'function',
|
|
203
203
|
function: {
|
|
204
|
-
|
|
204
|
+
function_type: 'mcp', // ← 前缀显示「调用 MCP」;缺省时有 mcpName 也会兼容判定为 MCP
|
|
205
205
|
name: 'query_table',
|
|
206
206
|
arguments: JSON.stringify({ table: 'events', limit: 50 }),
|
|
207
207
|
description: '通过 MCP 协议查询蓝鲸数据平台中的事件数据',
|
|
@@ -329,8 +329,8 @@ type FunctionCall = {
|
|
|
329
329
|
name: string; // 函数名;为空时标题 fallback 为 toolCall.id
|
|
330
330
|
arguments: string; // 调用参数(通常为 JSON 字符串)
|
|
331
331
|
description?: string; // 工具描述;为空时"描述"区块保留但内容为空白
|
|
332
|
-
mcpName?: string; // MCP 服务名;有值时标题格式变为 "{mcpName} / {name}",缺省
|
|
333
|
-
|
|
332
|
+
mcpName?: string; // MCP 服务名;有值时标题格式变为 "{mcpName} / {name}",缺省 function_type 时兼容判定为 MCP
|
|
333
|
+
function_type?: FunctionCallType; // 调用类型,决定头部前缀;不传按 mcpName 兼容判定
|
|
334
334
|
};
|
|
335
335
|
|
|
336
336
|
// ToolMessage —— 工具返回消息
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- AI SUMMARY -->
|
|
2
2
|
## 快速了解
|
|
3
3
|
|
|
4
|
-
useGlobalConfig 接收 GlobalConfig(含 size
|
|
4
|
+
useGlobalConfig 接收 GlobalConfig(含 size、supportUpload、timezone、menuSources、onUpload、onDeleteFile),以 GLOBAL_CONFIG_TOKEN provide 给后代; injectGlobalConfig 在子组件中取出配置,无 Provider 时返回 undefined。ChatContainer 在 setup 中调用 useGlobalConfig 注入 size、supportUpload、timezone、menuSources 以及主输入框同源的 onUpload / onDeleteFile; 后代组件可通过 injectGlobalConfig 读取配置;字号主题主要通过根节点 data-ai-size 与 CSS 变量生效。
|
|
5
5
|
|
|
6
6
|
### 关联组件
|
|
7
7
|
- **chat-container** — 根容器调用 useGlobalConfig 注入 supportUpload
|
|
@@ -97,6 +97,10 @@ export type GlobalConfig = {
|
|
|
97
97
|
timezone?: ComputedRef<string | undefined>;
|
|
98
98
|
/** 输入框菜单数据源;消息编辑态的内嵌输入框据此渲染 @ / \ 与 + 号菜单 */
|
|
99
99
|
menuSources?: ComputedRef<IInputMenuItem[]>;
|
|
100
|
+
/** 编辑态内嵌输入框复用主输入框的上传实现 */
|
|
101
|
+
onUpload?: (files: File[]) => Promise<ChatInputUploadResult | ChatInputUploadResult[]>;
|
|
102
|
+
/** 取消编辑态草稿里本次新选的附件;与主输入框 `@delete-file` 同源 */
|
|
103
|
+
onDeleteFile?: (file: Partial<UploadFile>) => void;
|
|
100
104
|
};
|
|
101
105
|
|
|
102
106
|
export function useGlobalConfig(options: GlobalConfig): {
|
|
@@ -104,6 +108,8 @@ export function useGlobalConfig(options: GlobalConfig): {
|
|
|
104
108
|
supportUpload: ComputedRef<boolean>;
|
|
105
109
|
timezone?: ComputedRef<string | undefined>;
|
|
106
110
|
menuSources?: ComputedRef<IInputMenuItem[]>;
|
|
111
|
+
onUpload?: GlobalConfig['onUpload'];
|
|
112
|
+
onDeleteFile?: GlobalConfig['onDeleteFile'];
|
|
107
113
|
};
|
|
108
114
|
|
|
109
115
|
export function injectGlobalConfig(): GlobalConfig | undefined;
|
|
@@ -121,9 +127,10 @@ export function injectGlobalConfig(): GlobalConfig | undefined;
|
|
|
121
127
|
| --------------- | ------------------------------------------------------------------------ |
|
|
122
128
|
| `size` | 可选。字号主题档位 `normal`(14px)/ `small`(12px),与 `ChatContainer.size` 对齐 |
|
|
123
129
|
| `supportUpload` | 是否支持上传,与根容器 `ChatContainer` 的 `supportUpload` 等展示策略对齐 |
|
|
124
|
-
| `menuSources` | 可选。输入框菜单数据源,供消息编辑态的内嵌 `ChatInput` 使用 |
|
|
125
|
-
| `timezone` | 可选。消息时间展示所用的 IANA 时区名,与 `ChatContainer.timezone` 对齐;未配置时 `MessageTime` 按浏览器时区展示 |
|
|
126
130
|
| `menuSources` | 可选。输入框菜单数据源,与 `ChatInput.menuSources` 同源(`ChatContainer` 传入的是补齐会话产物后的结果);[UserMessage](../components/message/user-message) 编辑态据此渲染菜单,未配置时编辑态无菜单 |
|
|
131
|
+
| `timezone` | 可选。消息时间展示所用的 IANA 时区名,与 `ChatContainer.timezone` 对齐;未配置时 `MessageTime` 按浏览器时区展示 |
|
|
132
|
+
| `onUpload` | 可选。编辑态内嵌 `ChatInput` 复用主输入框的上传回调,类型与 `ChatInput.onUpload` 一致 |
|
|
133
|
+
| `onDeleteFile` | 可选。编辑态取消/删除本次新选附件时调用,与主输入框 `@delete-file` 同源 |
|
|
127
134
|
|
|
128
135
|
### `useGlobalConfig(options)`
|
|
129
136
|
|
|
@@ -132,6 +139,8 @@ export function injectGlobalConfig(): GlobalConfig | undefined;
|
|
|
132
139
|
| `options.size` | 可选。字号主题档位,建议使用 `computed(() => props.size ?? 'small')` 与根 props 同步 |
|
|
133
140
|
| `options.supportUpload` | 是否支持上传,建议使用 `computed(() => props.supportUpload ?? false)` 与根 props 同步 |
|
|
134
141
|
| `options.timezone` | 可选。消息时间时区,建议使用 `computed(() => props.timezone)` 与根 props 同步;不设默认值,交由 `MessageTime` 回退浏览器时区 |
|
|
142
|
+
| `options.onUpload` | 可选。建议传入根容器已有的 `onUpload` prop,供编辑态复用 |
|
|
143
|
+
| `options.onDeleteFile` | 可选。建议转发根容器 `deleteFile` 事件,供编辑态清理本次新文件 |
|
|
135
144
|
|
|
136
145
|
- 调用后立即 `provide(GLOBAL_CONFIG_TOKEN, options)`。
|
|
137
146
|
- 必须在具有组件实例上下文的 `setup` 中调用(与 Vue `provide` 要求一致)。
|
|
@@ -151,7 +160,7 @@ export function injectGlobalConfig(): GlobalConfig | undefined;
|
|
|
151
160
|
|
|
152
161
|
## 关联组件
|
|
153
162
|
|
|
154
|
-
- [ChatContainer](../components/setup/chat-container) — 调用 `useGlobalConfig` 注入 `size`、`supportUpload`、`timezone`
|
|
155
|
-
- [UserMessage](../components/message/user-message) — 编辑态读取 `supportUpload` 与 `
|
|
163
|
+
- [ChatContainer](../components/setup/chat-container) — 调用 `useGlobalConfig` 注入 `size`、`supportUpload`、`timezone`、`menuSources` 以及 `onUpload` / `onDeleteFile`
|
|
164
|
+
- [UserMessage](../components/message/user-message) — 编辑态读取 `supportUpload`、`menuSources`、`onUpload` 与 `onDeleteFile`
|
|
156
165
|
- [MessageTime](../components/feedback/message-time) — 读取 `timezone` 展示消息时间
|
|
157
166
|
- [主题配置](../theme/theme) — `data-ai-size` 与 CSS 变量说明
|
|
@@ -72,8 +72,9 @@
|
|
|
72
72
|
defaultUploadFiles: binaryFiles
|
|
73
73
|
menuSources: injectGlobalConfig().menuSources
|
|
74
74
|
#send-icon slot → .user-edit-footer
|
|
75
|
-
Button "取消" → isEdit=false
|
|
76
|
-
Button primary "发送" →
|
|
75
|
+
Button "取消" → 清理本次新上传文件 + isEdit=false
|
|
76
|
+
Button primary "发送" → 有 sendDisabledTip 时禁用并提示;否则 triggerSendMessage(),仅真正发出时 isEdit=false
|
|
77
|
+
onUpload / @delete-file 来自 injectGlobalConfig()(与主输入框同源)
|
|
77
78
|
```
|
|
78
79
|
|
|
79
80
|
## 资源标签回显与正文折叠
|
|
@@ -351,7 +352,9 @@ binaryFiles 有值 → 进入编辑模式(editContent 可为空)
|
|
|
351
352
|
|
|
352
353
|
## 全局配置透传
|
|
353
354
|
|
|
354
|
-
编辑态 `ChatInput` 的上传能力与菜单数据源都来自 `injectGlobalConfig()`——`supportUpload` 与 `
|
|
355
|
+
编辑态 `ChatInput` 的上传能力与菜单数据源都来自 `injectGlobalConfig()`——`supportUpload`、`menuSources`、`onUpload` 与 `onDeleteFile`(通常由 `ChatContainer` 注册)。自定义 `#message` 插槽时须把同一配置链路保留,否则编辑态会与主输入区不一致(菜单为空、无法调用 upload 接口)。
|
|
356
|
+
|
|
357
|
+
删除原消息回填附件(无本地 `File`)只影响即将重发的草稿,不立刻 DELETE 远端;删除本次新选文件或点「取消」时,才对带 `File` 的附件调用 `onDeleteFile`。上传未完成或存在失败项时 `triggerSendMessage` 返回 `false`,保持编辑态;`#send-icon` 的 `sendDisabledTip` 会禁用「发送」并展示拦截文案。成功发送不调用 `onDeleteFile`。
|
|
355
358
|
|
|
356
359
|
```vue
|
|
357
360
|
<template>
|
|
@@ -397,7 +400,7 @@ binaryFiles 有值 → 进入编辑模式(editContent 可为空)
|
|
|
397
400
|
|
|
398
401
|
### 全局配置依赖
|
|
399
402
|
|
|
400
|
-
编辑态 `ChatInput` 通过 `injectGlobalConfig()` 读取 `supportUpload` 与 `menuSources
|
|
403
|
+
编辑态 `ChatInput` 通过 `injectGlobalConfig()` 读取 `supportUpload`、`menuSources`、`onUpload` 与 `onDeleteFile`(`menuSources` 缺省为空数组,即编辑态无菜单)。祖先需已 `useGlobalConfig()`(通常由 `ChatContainer` 注册)。
|
|
401
404
|
|
|
402
405
|
## 类型定义
|
|
403
406
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "2.0.0",
|
|
3
|
-
"generatedAt": "2026-09-
|
|
3
|
+
"generatedAt": "2026-09-23T04:00:43.775Z",
|
|
4
4
|
"domains": {
|
|
5
5
|
"setup": {
|
|
6
6
|
"label": "对话搭建",
|
|
@@ -1881,8 +1881,8 @@
|
|
|
1881
1881
|
"name": "useGlobalConfig",
|
|
1882
1882
|
"slug": "use-global-config",
|
|
1883
1883
|
"kind": "composable",
|
|
1884
|
-
"description": "在聊天根容器与子组件之间通过 provide/inject
|
|
1885
|
-
"aiSummary": "useGlobalConfig 接收 GlobalConfig(含 size
|
|
1884
|
+
"description": "在聊天根容器与子组件之间通过 provide/inject 共享全局展示配置(字号主题档位、是否支持上传、消息时间时区、输入框菜单数据源、编辑态上传/删除回调)。",
|
|
1885
|
+
"aiSummary": "useGlobalConfig 接收 GlobalConfig(含 size、supportUpload、timezone、menuSources、onUpload、onDeleteFile),以 GLOBAL_CONFIG_TOKEN provide 给后代; injectGlobalConfig 在子组件中取出配置,无 Provider 时返回 undefined。ChatContainer 在 setup 中调用 useGlobalConfig 注入 size、supportUpload、timezone、menuSources 以及主输入框同源的 onUpload / onDeleteFile; 后代组件可通过 injectGlobalConfig 读取配置;字号主题主要通过根节点 data-ai-size 与 CSS 变量生效。",
|
|
1886
1886
|
"relatedComponents": [
|
|
1887
1887
|
{
|
|
1888
1888
|
"slug": "chat-container",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blueking/chat-x",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0-beta.1",
|
|
4
4
|
"description": "蓝鲸智云 AI Chat 组件库 —— 遵循 AG-UI,为 AI Agent 和人类开发者共同设计的对话 UI 组件库。",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"vitepress": "2.0.0-alpha.16",
|
|
81
81
|
"vitest": "^4.0.18",
|
|
82
82
|
"vue-tsc": "^3.1.4",
|
|
83
|
-
"@blueking/chat-helper": "
|
|
83
|
+
"@blueking/chat-helper": "2.4.0"
|
|
84
84
|
},
|
|
85
85
|
"scripts": {
|
|
86
86
|
"dev": "vite --config vite.config.ts",
|
|
@@ -155,12 +155,12 @@ const collapsed = ref(false); // false = 展开,true = 折叠
|
|
|
155
155
|
|
|
156
156
|
### 核心交互
|
|
157
157
|
|
|
158
|
-
- **标题栏**:显示「执行情况」+ 所有任务聚合后的各状态计数(执行中 / 成功 / 失败 /
|
|
158
|
+
- **标题栏**:显示「执行情况」+ 所有任务聚合后的各状态计数(执行中 / 成功 / 失败 / 挂起 / 已终止 / 待执行 / 跳过),颜色区分。任一任务 `task_state === REVOKED` 时前置橙红色「已终止」并用括号包裹统计
|
|
159
159
|
- **任务组**:逐个展示任务行,带状态图标、总耗时;点击箭头图标可折叠/展开节点列表
|
|
160
160
|
- **有效证据**:`task.has_confidence === true` 时,任务行右侧展示「有效证据」按钮,点击后在侧栏打开置信度/证据详情 Tab(`props.has_confidence: true`)
|
|
161
161
|
- **默认激活**:当 `MessageContainer` 已注入滚动上下文(`useContainerScrollProvider`,供 `FlowAgentContent` 内 `useContainerScrollConsumer` 读取)时,组件挂载后若存在 `task.is_active === true` 且 `task.has_confidence === true` 的任务,会自动在侧栏打开该任务的「有效证据」Tab;无滚动 Provider(例如独立演示)时不做自动打开。用户手动切换 Tab 后不再沿用 `is_active` 默认高亮
|
|
162
162
|
- **选中态**:当前侧栏 Tab 与任务行 / 节点行联动高亮(`is-selected`);任务 Tab 与「有效证据」Tab 均视为该任务的选中态
|
|
163
|
-
-
|
|
163
|
+
- **节点列表**:每个节点显示状态圆点、名称和耗时;`REVOKED` 叶子节点使用已终止圆点(`#F55B0E` 描边 / `#FEE8DD` 浅底);hover 时出现行尾操作按钮组
|
|
164
164
|
- **失败节点操作**:失败且 `retryable` / `skippable` 为 `true` 的节点,hover 时额外展示「重试」「跳过」按钮,点击后通过 `onInterruptResume` 回传 Agent(不传 `interrupt`)。仅在对话流内出现:侧栏「执行情况」面板(`ExecutionSummary`)内渲染的同一消息只保留「详情」
|
|
165
165
|
- **节点详情**:点击「详情」会通过 `useCustomTabConsumer` 在 `ChatContainer` 侧边栏新增自定义 Tab,展示节点配置(基础信息、输入参数、输出参数)
|
|
166
166
|
|
|
@@ -173,11 +173,11 @@ FlowAgentContent(activityType = 'flow_agent')
|
|
|
173
173
|
├── ActivityLayout(公共折叠布局容器)
|
|
174
174
|
│ └── #title
|
|
175
175
|
│ ├── Loading / ArrowIcon(随 status 切换)
|
|
176
|
-
│ └──
|
|
176
|
+
│ └── 执行情况:[已终止(] 执行中 N / 成功 N / 失败 N / 挂起 N / 已终止 N [)]
|
|
177
177
|
└── #default
|
|
178
178
|
└── TaskGroup × N
|
|
179
179
|
├── TaskHeader(is-selected / has-confidence;箭头点击折叠)
|
|
180
|
-
│ ├── 状态图标(running=Loading / success / failed / suspended)
|
|
180
|
+
│ ├── 状态图标(running=Loading / success / failed / terminated / suspended)
|
|
181
181
|
│ ├── task_name(HighlightKeyword 支持搜索高亮)
|
|
182
182
|
│ └── trailing:总耗时 + 「有效证据」(has_confidence 时)
|
|
183
183
|
└── NodeList
|
|
@@ -313,15 +313,17 @@ const messages = [
|
|
|
313
313
|
|
|
314
314
|
### 节点状态映射
|
|
315
315
|
|
|
316
|
-
组件内部将 BkFlow
|
|
317
|
-
|
|
318
|
-
| 归并状态
|
|
319
|
-
|
|
|
320
|
-
| `running`
|
|
321
|
-
| `success`
|
|
322
|
-
| `failed`
|
|
323
|
-
| `suspended`
|
|
324
|
-
| `
|
|
316
|
+
组件内部将 BkFlow 原始状态归并为收敛显示状态:
|
|
317
|
+
|
|
318
|
+
| 归并状态 | 原始状态 | 颜色 | 统计 | 整体 header |
|
|
319
|
+
| ------------ | ----------------------------------------------------------------------------------- | --------- | ---- | ----------- |
|
|
320
|
+
| `running` | CREATED / LOOP_READY / READY / RUNNING / BLOCKED / ROLLING_BACK / ROLL_BACK_SUCCESS | #3A84FF | 是 | 否 |
|
|
321
|
+
| `success` | FINISHED | #65C389 | 是 | 否 |
|
|
322
|
+
| `failed` | FAILED / ROLL_BACK_FAILED | #EA3636 | 是 | 否 |
|
|
323
|
+
| `suspended` | SUSPENDED | #F59500 | 是 | 否 |
|
|
324
|
+
| `terminated` | REVOKED | #F55B0E | 是 | 是 |
|
|
325
|
+
| `pending` | PENDING | #4D4F56 | 是 | 否 |
|
|
326
|
+
| `skipped` | SKIPPED | #5B7290 | 是 | 否 |
|
|
325
327
|
|
|
326
328
|
### 侧栏 Tab 命名规则
|
|
327
329
|
|
|
@@ -196,7 +196,7 @@ AI 可在一次回复中发起多个工具调用,组件依次渲染:
|
|
|
196
196
|
|
|
197
197
|
### MCP 工具调用
|
|
198
198
|
|
|
199
|
-
`function.
|
|
199
|
+
`function.function_type` 为 `'mcp'`(或旧数据仅有 `mcpName`)时,`ToolCallRender` 头部显示为「调用 MCP {mcpName} / {name}」:
|
|
200
200
|
|
|
201
201
|
```vue
|
|
202
202
|
<script setup lang="ts">
|
|
@@ -205,7 +205,7 @@ AI 可在一次回复中发起多个工具调用,组件依次渲染:
|
|
|
205
205
|
id: 'call_mcp_1',
|
|
206
206
|
type: 'function',
|
|
207
207
|
function: {
|
|
208
|
-
|
|
208
|
+
function_type: 'mcp', // 调用类型,缺省时有 mcpName 也会兼容判定为 MCP
|
|
209
209
|
name: 'query_database',
|
|
210
210
|
arguments: '{"sql": "SELECT * FROM users LIMIT 10"}',
|
|
211
211
|
description: '执行数据库查询',
|
|
@@ -478,6 +478,7 @@ type FunctionCall = {
|
|
|
478
478
|
arguments: string; // JSON 字符串格式的参数
|
|
479
479
|
description?: string; // 函数描述
|
|
480
480
|
mcpName?: string; // MCP 服务名(存在时标题显示 "调用 MCP")
|
|
481
|
+
function_type?: 'function' | 'mcp' | 'skill'; // 调用类型,决定头部前缀;不传时有 mcpName 按 MCP 判定
|
|
481
482
|
};
|
|
482
483
|
|
|
483
484
|
// 工具执行结果
|