@blueking/chat-x 0.0.45-beta.5 → 0.0.45-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/ag-ui/types/constants.d.ts +0 -16
- package/dist/ag-ui/types/contents.d.ts +0 -2
- package/dist/ag-ui/types/index.d.ts +0 -2
- package/dist/ag-ui/types/messages.d.ts +0 -2
- package/dist/components/chat-content/flow-agent-content/flow-agent-content.vue.d.ts +0 -3
- package/dist/components/chat-content/flow-agent-content/use-flow-agent.d.ts +0 -4
- package/dist/components/chat-input/chat-input.vue.d.ts +8 -14
- package/dist/components/chat-input/input-attachment/input-attachment.vue.d.ts +0 -1
- package/dist/components/chat-message/activity-message/activity-message.vue.d.ts +1 -4
- package/dist/components/chat-message/assistant-message/assistant-message.vue.d.ts +1 -1
- package/dist/components/chat-message/message-container/message-container.vue.d.ts +7 -14
- package/dist/components/chat-message/message-render/message-render.vue.d.ts +0 -4
- package/dist/components/index.d.ts +2 -3
- package/dist/composables/use-global-config.d.ts +0 -3
- package/dist/composables/use-message-group.d.ts +823 -2609
- package/dist/icons/index.d.ts +0 -1
- package/dist/index.css +1 -1
- package/dist/index.js +1935 -2552
- package/dist/index.js.map +1 -1
- package/dist/lang/lang.d.ts +2 -34
- package/dist/mcp/generated/docs/activity-message.md +7 -21
- package/dist/mcp/generated/docs/ai-image.md +4 -9
- package/dist/mcp/generated/docs/ai-loading.md +6 -11
- package/dist/mcp/generated/docs/ai-selection.md +5 -10
- package/dist/mcp/generated/docs/animation-text.md +4 -9
- package/dist/mcp/generated/docs/assistant-message.md +5 -10
- package/dist/mcp/generated/docs/chat-container.md +19 -173
- package/dist/mcp/generated/docs/chat-input.md +10 -78
- package/dist/mcp/generated/docs/cite-content.md +3 -8
- package/dist/mcp/generated/docs/code-content.md +4 -9
- package/dist/mcp/generated/docs/common-error-content.md +5 -10
- package/dist/mcp/generated/docs/constants.md +3 -68
- package/dist/mcp/generated/docs/content-render.md +5 -10
- package/dist/mcp/generated/docs/delete-tool.md +4 -9
- package/dist/mcp/generated/docs/desc-panel.md +4 -9
- package/dist/mcp/generated/docs/execution-summary.md +5 -10
- package/dist/mcp/generated/docs/file-content.md +4 -9
- package/dist/mcp/generated/docs/file-upload-btn.md +5 -10
- package/dist/mcp/generated/docs/highlight-keyword.md +5 -10
- package/dist/mcp/generated/docs/image-content.md +4 -9
- package/dist/mcp/generated/docs/image-preview-group.md +4 -9
- package/dist/mcp/generated/docs/image-preview.md +5 -10
- package/dist/mcp/generated/docs/info-message.md +2 -7
- package/dist/mcp/generated/docs/key-value-content.md +4 -9
- package/dist/mcp/generated/docs/latex-content.md +4 -9
- package/dist/mcp/generated/docs/loading-message.md +6 -11
- package/dist/mcp/generated/docs/markdown-container.md +1 -1
- package/dist/mcp/generated/docs/markdown-content.md +8 -13
- package/dist/mcp/generated/docs/markdown-latex.md +3 -3
- package/dist/mcp/generated/docs/markdown-mermaid.md +3 -3
- package/dist/mcp/generated/docs/mermaid-content.md +4 -9
- package/dist/mcp/generated/docs/message-container.md +11 -69
- package/dist/mcp/generated/docs/message-render.md +11 -23
- package/dist/mcp/generated/docs/message-tools.md +5 -10
- package/dist/mcp/generated/docs/messages.md +11 -75
- package/dist/mcp/generated/docs/overflow-tips.md +4 -4
- package/dist/mcp/generated/docs/reasoning-message.md +5 -10
- package/dist/mcp/generated/docs/reference-content.md +5 -10
- package/dist/mcp/generated/docs/scroll-btn.md +3 -8
- package/dist/mcp/generated/docs/selection-footer.md +4 -9
- package/dist/mcp/generated/docs/shortcut-btn.md +5 -10
- package/dist/mcp/generated/docs/shortcut-btns.md +5 -10
- package/dist/mcp/generated/docs/shortcut-render.md +5 -10
- package/dist/mcp/generated/docs/text-content.md +4 -9
- package/dist/mcp/generated/docs/theme.md +4 -50
- package/dist/mcp/generated/docs/tool-btn.md +4 -9
- package/dist/mcp/generated/docs/tool-message.md +5 -10
- package/dist/mcp/generated/docs/toolcall-render.md +5 -10
- package/dist/mcp/generated/docs/use-animation-text.md +4 -4
- package/dist/mcp/generated/docs/use-clipboard.md +3 -3
- package/dist/mcp/generated/docs/use-command-selection.md +1 -1
- package/dist/mcp/generated/docs/use-custom-tab.md +1 -1
- package/dist/mcp/generated/docs/use-full-screen.md +3 -3
- package/dist/mcp/generated/docs/use-global-config.md +5 -20
- package/dist/mcp/generated/docs/use-menu-keydown.md +1 -1
- package/dist/mcp/generated/docs/use-message-group.md +9 -40
- package/dist/mcp/generated/docs/use-observer-visible-list.md +1 -1
- package/dist/mcp/generated/docs/user-feedback.md +3 -8
- package/dist/mcp/generated/docs/user-message.md +5 -10
- package/dist/mcp/generated/index.json +560 -1103
- package/dist/mcp/index.js +0 -0
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/list-components.d.ts +6 -7
- package/dist/mcp/tools/list-components.js +29 -23
- package/dist/mcp/tools/list-components.js.map +1 -1
- package/dist/mcp/tools/search-docs.js +1 -1
- package/dist/mcp/tools/search-docs.js.map +1 -1
- package/dist/mcp/utils/doc-loader.d.ts +1 -1
- package/package.json +21 -23
- package/dist/ag-ui/types/interrupt.d.ts +0 -137
- package/dist/ag-ui/types/schema.d.ts +0 -42
- package/dist/components/ai-questions/questions-container.vue.d.ts +0 -3
- package/dist/components/ai-questions/selection-question.vue.d.ts +0 -3
- package/dist/components/chat-content/flow-agent-content/use-flow-node-actions.d.ts +0 -32
- package/dist/components/chat-content/index.d.ts +0 -2
- package/dist/components/chat-input/input-info-alert.vue.d.ts +0 -6
- package/dist/components/chat-message/interrupt-message/index.d.ts +0 -2
- package/dist/components/chat-message/interrupt-message/interrupt-message.vue.d.ts +0 -17
- package/dist/components/chat-message/interrupt-message/tool-approval-card.vue.d.ts +0 -8
- package/dist/components/chat-message/interrupt-message/user-question/index.d.ts +0 -5
- package/dist/components/chat-message/interrupt-message/user-question/use-user-question.d.ts +0 -35
- package/dist/components/chat-message/interrupt-message/user-question/user-question-answered-card.vue.d.ts +0 -25
- package/dist/components/chat-message/interrupt-message/user-question/user-question-card.vue.d.ts +0 -25
- package/dist/components/chat-message/interrupt-message/user-question/user-question-choice.vue.d.ts +0 -13
- package/dist/components/chat-message/interrupt-message/user-question/user-question-option.vue.d.ts +0 -17
- package/dist/icons/interrupt.d.ts +0 -24
- package/dist/mcp/generated/docs/activity-layout.md +0 -138
- package/dist/mcp/generated/docs/ai-prompt-list.md +0 -42
- package/dist/mcp/generated/docs/ai-slash-editor.md +0 -43
- package/dist/mcp/generated/docs/ai-slash-input.md +0 -43
- package/dist/mcp/generated/docs/ai-slash-menu.md +0 -42
- package/dist/mcp/generated/docs/detail-section.md +0 -93
- package/dist/mcp/generated/docs/flow-agent-content.md +0 -252
- package/dist/mcp/generated/docs/flow-agent-node-detail.md +0 -240
- package/dist/mcp/generated/docs/input-attachment.md +0 -43
- package/dist/mcp/generated/docs/input-info-alert.md +0 -42
- package/dist/mcp/generated/docs/interrupt-message.md +0 -204
- package/dist/mcp/generated/docs/interrupt.md +0 -354
- package/dist/mcp/generated/docs/knowledge-rag-content.md +0 -126
- package/dist/mcp/generated/docs/message-loading.md +0 -120
- package/dist/mcp/generated/docs/preview-toolbar.md +0 -42
- package/dist/mcp/generated/docs/questions-container.md +0 -88
- package/dist/mcp/generated/docs/reference-doc-content.md +0 -112
- package/dist/mcp/generated/docs/schema.md +0 -93
- package/dist/mcp/generated/docs/selection-question.md +0 -91
- package/dist/mcp/generated/docs/simple-table.md +0 -103
- package/dist/mcp/generated/docs/tool-approval-card.md +0 -148
- package/dist/mcp/generated/docs/use-flow-node-actions.md +0 -124
- package/dist/mcp/generated/docs/user-question-answered-card.md +0 -106
- package/dist/mcp/generated/docs/user-question-card.md +0 -228
- package/dist/mcp/generated/docs/user-question-choice.md +0 -108
- package/dist/mcp/generated/docs/user-question-option.md +0 -42
- package/dist/mcp/generated/docs/vnode-renderer.md +0 -126
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
<!-- AI SUMMARY -->
|
|
2
|
-
## 快速了解
|
|
3
|
-
|
|
4
|
-
渲染 human-in-the-loop 中断消息,分发工具审批,并回显用户问题回答结果。 源码位置:src/components/chat-message/interrupt-message/interrupt-message.vue。
|
|
5
|
-
|
|
6
|
-
### 关联组件
|
|
7
|
-
- **message-render** — role 为 interrupt 时渲染本组件
|
|
8
|
-
- **user-question-card** — UserQuestion 待回答面板与回答回显
|
|
9
|
-
- **tool-approval-card** — AIDevToolApproval 专用子卡片
|
|
10
|
-
- **message-container** — 透传 onInterruptResume;末条为 interrupt 时不触发组 hover
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
<!-- FULL DOC -->
|
|
14
|
-
|
|
15
|
-
# InterruptMessage 中断消息
|
|
16
|
-
## 源码事实
|
|
17
|
-
|
|
18
|
-
- **源码位置**:`src/components/chat-message/interrupt-message/interrupt-message.vue`
|
|
19
|
-
- **能力域**:Agent 能力
|
|
20
|
-
- **能力说明**:渲染 human-in-the-loop 中断消息,分发工具审批,并回显用户问题回答结果。
|
|
21
|
-
|
|
22
|
-
> **能力域**:Agent 能力
|
|
23
|
-
|
|
24
|
-
human-in-the-loop 中断消息渲染器(导出名 **`InterruptMessageRender`**)。对应 `MessageRole.Interrupt`,解析 `content.outcome` 渲染审批卡片或兜底提示。
|
|
25
|
-
|
|
26
|
-
> 通常由 [MessageRender](/components/message/message-render) 自动调用,无需业务侧直接引入。
|
|
27
|
-
> `UserQuestion` 的待回答卡片由 [ChatContainer](/components/setup/chat-container) 放在输入区上方,本组件只负责 success 后的会话内回答回显。
|
|
28
|
-
|
|
29
|
-
## 渲染架构
|
|
30
|
-
|
|
31
|
-
```
|
|
32
|
-
InterruptMessageRender
|
|
33
|
-
├── content.message(可选)→ 顶部说明文案
|
|
34
|
-
└── content.outcome.type === 'interrupt'
|
|
35
|
-
└── v-for interrupts
|
|
36
|
-
├── reason === aidev:tool_approval → ToolApprovalCard(透传 onInterruptResume,用于取消审批)
|
|
37
|
-
├── reason === aidev:user_question → 不在消息内渲染,交由 ChatContainer 输入区挂载
|
|
38
|
-
└── 未注册 reason → 兜底块(item.message 或「暂不支持的中断消息」)
|
|
39
|
-
|
|
40
|
-
content.outcome.type === 'success'
|
|
41
|
-
└── result.reason === aidev:user_question → UserQuestionAnsweredCard 回显回答(支持 #answeredQuestion 透传 #answer)
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
| `InterruptReason` | 子组件 |
|
|
45
|
-
| ------------------------------ | ------------------- |
|
|
46
|
-
| `aidev:tool_approval` | `ToolApprovalCard` |
|
|
47
|
-
| `aidev:user_question`(待回答) | 输入区 `UserQuestionCard`,本组件不渲染 |
|
|
48
|
-
| `aidev:user_question`(已回答) | `UserQuestionAnsweredCard` |
|
|
49
|
-
| 其他 / 未注册 | 兜底文案区域 |
|
|
50
|
-
|
|
51
|
-
## 基础用法(待审批)
|
|
52
|
-
|
|
53
|
-
```vue
|
|
54
|
-
<template>
|
|
55
|
-
<InterruptMessageRender
|
|
56
|
-
:id="message.id"
|
|
57
|
-
:message-id="message.messageId"
|
|
58
|
-
:role="message.role"
|
|
59
|
-
:status="message.status"
|
|
60
|
-
:content="message.content"
|
|
61
|
-
:on-interrupt-resume="handleInterruptResume"
|
|
62
|
-
/>
|
|
63
|
-
</template>
|
|
64
|
-
|
|
65
|
-
<script setup lang="ts">
|
|
66
|
-
import {
|
|
67
|
-
InterruptMessageRender,
|
|
68
|
-
APPROVAL_STATUS,
|
|
69
|
-
InterruptReason,
|
|
70
|
-
MessageRole,
|
|
71
|
-
MessageStatus,
|
|
72
|
-
type InterruptMessage,
|
|
73
|
-
} from '@blueking/chat-x';
|
|
74
|
-
|
|
75
|
-
const message: InterruptMessage = {
|
|
76
|
-
id: 'msg_interrupt',
|
|
77
|
-
messageId: 'msg_interrupt',
|
|
78
|
-
role: MessageRole.Interrupt,
|
|
79
|
-
status: MessageStatus.Pending,
|
|
80
|
-
content: {
|
|
81
|
-
message: '算法方案评审单需要您关注',
|
|
82
|
-
outcome: {
|
|
83
|
-
type: 'interrupt',
|
|
84
|
-
interrupts: [
|
|
85
|
-
{
|
|
86
|
-
id: 'interrupt_1',
|
|
87
|
-
reason: InterruptReason.AIDevToolApproval,
|
|
88
|
-
toolCallId: 'tool_call_1',
|
|
89
|
-
metadata: {
|
|
90
|
-
ticket: {
|
|
91
|
-
approvers: ['张三'],
|
|
92
|
-
sn: 'REV-2026-04-24-001',
|
|
93
|
-
status: APPROVAL_STATUS.PENDING,
|
|
94
|
-
submit_time: '2026-04-24 14:30:15',
|
|
95
|
-
title: '算法方案评审单',
|
|
96
|
-
url: 'https://example.com/tickets/001',
|
|
97
|
-
},
|
|
98
|
-
},
|
|
99
|
-
},
|
|
100
|
-
],
|
|
101
|
-
},
|
|
102
|
-
},
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
const handleInterruptResume = async (payload, interrupt) => {
|
|
106
|
-
// ToolApprovalCard 点击「取消审批」时,payload 为 ToolApprovalResume
|
|
107
|
-
console.log(payload, interrupt?.id);
|
|
108
|
-
};
|
|
109
|
-
</script>
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
**渲染效果**
|
|
113
|
-
|
|
114
|
-
## UserQuestion 待回答
|
|
115
|
-
|
|
116
|
-
待回答的 `UserQuestion` 不在消息内渲染;`ChatContainer` 会找到最近一条待回答中断,并在 `ChatInput` 上方挂载 [UserQuestionCard](/components/agent/user-question-card)。
|
|
117
|
-
|
|
118
|
-
```vue
|
|
119
|
-
<InterruptMessageRender
|
|
120
|
-
:content="userQuestionMessage.content"
|
|
121
|
-
role="interrupt"
|
|
122
|
-
/>
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
**渲染效果**
|
|
126
|
-
|
|
127
|
-
## UserQuestion 已回答回显(outcome.success)
|
|
128
|
-
|
|
129
|
-
`outcome.type === 'success'` 且 `result.reason === InterruptReason.UserQuestion` 时,会话内回显用户回答。可通过 `#answeredQuestion` slot 自定义单题回显:
|
|
130
|
-
|
|
131
|
-
```vue
|
|
132
|
-
<InterruptMessageRender
|
|
133
|
-
:content="userQuestionAnsweredMessage.content"
|
|
134
|
-
role="interrupt"
|
|
135
|
-
>
|
|
136
|
-
<template #answeredQuestion="{ item, index, status }">
|
|
137
|
-
<MyCustomAnswerView :data="item" :index="index" :status="status" />
|
|
138
|
-
</template>
|
|
139
|
-
</InterruptMessageRender>
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
**渲染效果**
|
|
143
|
-
|
|
144
|
-
## 其他已 resume(outcome.success)
|
|
145
|
-
|
|
146
|
-
非 `UserQuestion` 的 success 态不渲染中断卡片,仅保留可选顶部 `content.message`:
|
|
147
|
-
|
|
148
|
-
## 不支持的中断类型(兜底)
|
|
149
|
-
|
|
150
|
-
```vue
|
|
151
|
-
<InterruptMessageRender :content="unsupportedContent" role="interrupt" />
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
**渲染效果**
|
|
155
|
-
|
|
156
|
-
## 在 MessageContainer 中使用
|
|
157
|
-
|
|
158
|
-
配置 `onInterruptResume`,由容器经 `MessageRender` 透传到本组件:
|
|
159
|
-
|
|
160
|
-
```vue
|
|
161
|
-
<MessageContainer
|
|
162
|
-
:messages="messages"
|
|
163
|
-
:on-interrupt-resume="handleInterruptResume"
|
|
164
|
-
/>
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
当消息组**最后一条**为 `role: 'interrupt'` 时,容器**不会**在鼠标移入时设置 `isHover`,避免误显 AI 工具栏遮挡审批卡片。
|
|
168
|
-
|
|
169
|
-
## API
|
|
170
|
-
|
|
171
|
-
### Props
|
|
172
|
-
|
|
173
|
-
继承 `Partial<InterruptMessage>` 的字段(`id`、`messageId`、`role`、`content`、`status` 等),并额外支持:
|
|
174
|
-
|
|
175
|
-
| 属性名 | 类型 | 默认值 | 说明 |
|
|
176
|
-
| ----------------- | ------------------ | ------ | ----------------------------------------- |
|
|
177
|
-
| content | `InterruptMessage['content']` | — | 含 `message`、`outcome`、`result` 等 |
|
|
178
|
-
| onInterruptResume | `OnInterruptResume` | — | 用户完成中断操作后的回调(可选) |
|
|
179
|
-
|
|
180
|
-
### Slots
|
|
181
|
-
|
|
182
|
-
| 插槽名 | 参数 | 说明 |
|
|
183
|
-
| ---------------- | ------------------------------------------------- | -------------------------------------------------------------------- |
|
|
184
|
-
| answeredQuestion | `{ item, index, status }` | 自定义 UserQuestion 已回答内容回显,透传给 `UserQuestionAnsweredCard` 的 `#answer` |
|
|
185
|
-
|
|
186
|
-
slot 参数与 [UserQuestionAnsweredCard](/components/agent/user-question-answered-card) 的 `#answer` 一致。
|
|
187
|
-
|
|
188
|
-
### Events / Expose
|
|
189
|
-
|
|
190
|
-
无。
|
|
191
|
-
|
|
192
|
-
## 类型定义
|
|
193
|
-
|
|
194
|
-
```typescript
|
|
195
|
-
import type { Interrupt, InterruptMessage, OnInterruptResume } from '@blueking/chat-x';
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
详见 [中断类型 Interrupt](../../types/interrupt.md)。
|
|
199
|
-
|
|
200
|
-
## 关联组件
|
|
201
|
-
|
|
202
|
-
- [ToolApprovalCard](/components/agent/tool-approval-card) — AI Dev 审批单卡片
|
|
203
|
-
- [MessageRender](/components/message/message-render) — 按 `role` 派发
|
|
204
|
-
- [MessageContainer](/components/setup/message-container) — 列表容器与 `onInterruptResume` 透传
|
|
@@ -1,354 +0,0 @@
|
|
|
1
|
-
<!-- AI SUMMARY -->
|
|
2
|
-
## 快速了解
|
|
3
|
-
|
|
4
|
-
定义 RunFinishedOutcome、BaseInterrupt、AIDevToolApprovalInterrupt、UserQuestionInterrupt、BaseResume、InterruptMessage 与 OnInterruptResume。 与 MessageRole.Interrupt、InterruptMessageRender、UserQuestionCard、ToolApprovalCard 配合,对应 RUN_FINISHED outcome。
|
|
5
|
-
|
|
6
|
-
### 关联组件
|
|
7
|
-
- **interrupt-message** — 根据 outcome.interrupts 与 reason 渲染中断 UI,success 时回显 UserQuestion 回答
|
|
8
|
-
- **user-question-card** — UserQuestion 交互面板,挂载在 ChatInput 上方
|
|
9
|
-
- **tool-approval-card** — AIDevToolApproval 专用卡片
|
|
10
|
-
- **message-render** — role 为 interrupt 时派发 InterruptMessageRender
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
<!-- FULL DOC -->
|
|
14
|
-
|
|
15
|
-
# 中断类型 Interrupt
|
|
16
|
-
|
|
17
|
-
> **分类**:type
|
|
18
|
-
|
|
19
|
-
AG-UI [Interrupts](https://docs.ag-ui.com/drafts/interrupts) 协议相关类型,定义在 `src/ag-ui/types/interrupt.ts`,由 `@blueking/chat-x` 导出。
|
|
20
|
-
|
|
21
|
-
中断链路分为两段:
|
|
22
|
-
|
|
23
|
-
1. Agent 返回 `RUN_FINISHED { outcome: { type: 'interrupt', interrupts } }`,前端渲染等待用户处理的 UI。
|
|
24
|
-
2. 用户操作后调用 `onInterruptResume(payload, interrupt?)`,业务侧按 `payload.operation` 分支处理,并将 `payload` 作为 `RunAgentInput.resume` 回传给 Agent。
|
|
25
|
-
|
|
26
|
-
## InterruptResumeOperation
|
|
27
|
-
|
|
28
|
-
统一标识用户在「中断消息 / 活动消息」上触发的、需回传 Agent 处理的动作:
|
|
29
|
-
|
|
30
|
-
```typescript
|
|
31
|
-
enum InterruptResumeOperation {
|
|
32
|
-
/** 主动取消第三方工具审批 */
|
|
33
|
-
ApprovalCancel = 'approval_cancel',
|
|
34
|
-
/** 重试失败的流程节点(bkflow) */
|
|
35
|
-
FlowNodeRetry = 'flow_node_retry',
|
|
36
|
-
/** 跳过失败的流程节点(bkflow) */
|
|
37
|
-
FlowNodeSkip = 'flow_node_skip',
|
|
38
|
-
}
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
业务侧通过 `onInterruptResume` 回调的 `payload.operation` 字段进行分支处理;新增操作类型只需扩展此枚举,回调契约与透传链路保持不变。
|
|
42
|
-
|
|
43
|
-
## RunFinishedOutcome
|
|
44
|
-
|
|
45
|
-
`RUN_FINISHED` 事件的 `outcome` 联合类型:
|
|
46
|
-
|
|
47
|
-
```typescript
|
|
48
|
-
type RunFinishedOutcome =
|
|
49
|
-
| { interrupts: Interrupt[]; type: 'interrupt' }
|
|
50
|
-
| { type: 'success' };
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
| `type` | 说明 |
|
|
54
|
-
| ------------- | -------------------------------------------------------------------- |
|
|
55
|
-
| `'interrupt'` | 等待用户响应;`interrupts` 驱动 UI 渲染审批卡片、用户问题面板等 |
|
|
56
|
-
| `'success'` | 用户已通过 `resume` 处理;若 `result.reason === UserQuestion` 则回显回答内容 |
|
|
57
|
-
|
|
58
|
-
## BaseInterrupt
|
|
59
|
-
|
|
60
|
-
所有中断项的公共结构:
|
|
61
|
-
|
|
62
|
-
```typescript
|
|
63
|
-
type BaseInterrupt<T extends InterruptReason, M extends Record<string, any>> = {
|
|
64
|
-
expiresAt?: string;
|
|
65
|
-
id: string;
|
|
66
|
-
message?: string;
|
|
67
|
-
metadata?: M;
|
|
68
|
-
properties?: Record<string, any>;
|
|
69
|
-
reason: T;
|
|
70
|
-
toolCallId: string;
|
|
71
|
-
};
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## AIDevToolApprovalInterrupt
|
|
75
|
-
|
|
76
|
-
AI Dev 第三方工具审批中断,`reason` 为 `InterruptReason.AIDevToolApproval`(`'aidev:tool_approval'`):
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
type AIDevToolApprovalInterrupt = BaseInterrupt<
|
|
80
|
-
InterruptReason.AIDevToolApproval,
|
|
81
|
-
{
|
|
82
|
-
ticket: {
|
|
83
|
-
approvers: string[];
|
|
84
|
-
sn: string;
|
|
85
|
-
status: APPROVAL_STATUS;
|
|
86
|
-
submit_time: string;
|
|
87
|
-
title: string;
|
|
88
|
-
url: string;
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
>;
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## UserQuestionInterrupt
|
|
95
|
-
|
|
96
|
-
用户回答问题中断,`reason` 为 `InterruptReason.UserQuestion`(`'aidev:user_question'`)。交互面板由 `ChatContainer` 挂载到 `ChatInput` 上方。
|
|
97
|
-
|
|
98
|
-
```typescript
|
|
99
|
-
type UserQuestionInterrupt = BaseInterrupt<
|
|
100
|
-
InterruptReason.UserQuestion,
|
|
101
|
-
{
|
|
102
|
-
questions: UserQuestionItem[];
|
|
103
|
-
}
|
|
104
|
-
>;
|
|
105
|
-
|
|
106
|
-
type UserQuestionItem = {
|
|
107
|
-
header: string;
|
|
108
|
-
/** 是否多选;仅选择题语义,自定义表单类问题可不传 */
|
|
109
|
-
multiSelect?: boolean;
|
|
110
|
-
options?: UserQuestionOptionItem[];
|
|
111
|
-
question: string;
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
type UserQuestionOptionItem = {
|
|
115
|
-
description: string;
|
|
116
|
-
label: string;
|
|
117
|
-
};
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
约定:
|
|
121
|
-
|
|
122
|
-
- `multiSelect: false` 表示单选题,`true` 表示多选题;**不传**时 UI 不展示单选/多选标签,默认选择题组件仍按单选行为处理。
|
|
123
|
-
- 前端会为每道**选择题**追加 `label: 'others'` 的自由输入项;后端无需重复下发该选项。
|
|
124
|
-
- 当用户选择 Others 时,`answer[].description` 为用户输入文本。
|
|
125
|
-
- 业务可通过 `UserQuestionCard` 的 `#question` slot 渲染自定义表单;作答有效时调用 `setAnswer` 回传 `UserQuestionAnswerItem`,无效时传 `undefined`。
|
|
126
|
-
|
|
127
|
-
## Interrupt
|
|
128
|
-
|
|
129
|
-
当前支持的中断联合类型:
|
|
130
|
-
|
|
131
|
-
```typescript
|
|
132
|
-
type Interrupt =
|
|
133
|
-
| AIDevToolApprovalInterrupt
|
|
134
|
-
| UserQuestionInterrupt
|
|
135
|
-
| BaseInterrupt<InterruptReason, Record<string, any>>;
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
## InterruptResume 联合类型
|
|
139
|
-
|
|
140
|
-
```typescript
|
|
141
|
-
type InterruptResume = FlowNodeResume | ToolApprovalResume | UserQuestionResume;
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
| 类型 | `operation` / `reason` | 说明 |
|
|
145
|
-
| -------------------- | ----------------------------------- | ------------------------------------------------------------ |
|
|
146
|
-
| `ToolApprovalResume` | `InterruptResumeOperation.ApprovalCancel` | 第三方工具审批取消 |
|
|
147
|
-
| `FlowNodeResume` | `flow_node_retry` / `flow_node_skip` | FlowAgent 失败节点重试 / 跳过;**无**对应 `Interrupt` 项 |
|
|
148
|
-
| `UserQuestionResume` | `InterruptReason.UserQuestion`(`reason` 字段) | 用户回答问题 |
|
|
149
|
-
|
|
150
|
-
### ToolApprovalResume
|
|
151
|
-
|
|
152
|
-
```typescript
|
|
153
|
-
type ToolApprovalResume = {
|
|
154
|
-
operation: InterruptResumeOperation.ApprovalCancel;
|
|
155
|
-
payload: { interrupt_id: number | string };
|
|
156
|
-
};
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
### FlowNodeResume
|
|
160
|
-
|
|
161
|
-
流程节点不属于 interrupt,节点定位信息(`task_id` / `node_id`)随 `payload` 回传;此时 `onInterruptResume` 的第二个 `interrupt` 参数**不传**。
|
|
162
|
-
|
|
163
|
-
```typescript
|
|
164
|
-
type FlowNodeResume = {
|
|
165
|
-
operation: InterruptResumeOperation.FlowNodeRetry | InterruptResumeOperation.FlowNodeSkip;
|
|
166
|
-
payload: {
|
|
167
|
-
node_id: string;
|
|
168
|
-
task_id: number;
|
|
169
|
-
};
|
|
170
|
-
};
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
## BaseResume / UserQuestionResume
|
|
174
|
-
|
|
175
|
-
`UserQuestion` 的 resume payload 为单个对象,与 `chat-helper` 的 `IResume` 保持一致:
|
|
176
|
-
|
|
177
|
-
```typescript
|
|
178
|
-
type BaseResume<T extends InterruptReason, P extends Record<string, any>> = {
|
|
179
|
-
interruptId: string;
|
|
180
|
-
payload: P;
|
|
181
|
-
reason: T;
|
|
182
|
-
status: 'cancelled' | 'resolved';
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
type UserQuestionAnswerItem = {
|
|
186
|
-
answer: UserQuestionOptionItem[];
|
|
187
|
-
multiSelect?: boolean;
|
|
188
|
-
question: string;
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
type UserQuestionResume = BaseResume<
|
|
192
|
-
InterruptReason.UserQuestion,
|
|
193
|
-
{
|
|
194
|
-
answers: UserQuestionAnswerItem[];
|
|
195
|
-
}
|
|
196
|
-
>;
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
示例:
|
|
200
|
-
|
|
201
|
-
```typescript
|
|
202
|
-
const resume: UserQuestionResume = {
|
|
203
|
-
interruptId: 'interrupt_user_question',
|
|
204
|
-
reason: InterruptReason.UserQuestion,
|
|
205
|
-
status: 'resolved',
|
|
206
|
-
payload: {
|
|
207
|
-
answers: [
|
|
208
|
-
{
|
|
209
|
-
question: '请选择语言',
|
|
210
|
-
multiSelect: true,
|
|
211
|
-
answer: [
|
|
212
|
-
{ label: 'Java', description: 'Java' },
|
|
213
|
-
{ label: 'others', description: 'Rust' },
|
|
214
|
-
],
|
|
215
|
-
},
|
|
216
|
-
],
|
|
217
|
-
},
|
|
218
|
-
};
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
## InterruptMessage
|
|
222
|
-
|
|
223
|
-
`MessageRole.Interrupt` 对应的消息类型,`content` 承载 outcome、可选说明文案与 resume 结果:
|
|
224
|
-
|
|
225
|
-
```typescript
|
|
226
|
-
type InterruptMessage = BaseMessage<
|
|
227
|
-
MessageRole.Interrupt,
|
|
228
|
-
{
|
|
229
|
-
message?: string;
|
|
230
|
-
outcome?: RunFinishedOutcome;
|
|
231
|
-
result?: BaseResume<InterruptReason>;
|
|
232
|
-
runId?: string;
|
|
233
|
-
threadId?: string;
|
|
234
|
-
}
|
|
235
|
-
>;
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
| 字段 | 说明 |
|
|
239
|
-
| ---------- | ------------------------------------------------------------ |
|
|
240
|
-
| `message` | 消息组顶部可选说明文案,由 `InterruptMessageRender` 展示 |
|
|
241
|
-
| `outcome` | `type: 'interrupt'` 时从 `interrupts` 渲染交互;`success` 时进入已处理态 |
|
|
242
|
-
| `result` | 用户 resume 后回传的单对象 payload;`UserQuestion` 会用于会话内回显 |
|
|
243
|
-
| `runId` | 关联 AG-UI run 标识 |
|
|
244
|
-
| `threadId` | 关联会话线程标识 |
|
|
245
|
-
|
|
246
|
-
## OnInterruptResume
|
|
247
|
-
|
|
248
|
-
用户完成中断操作或 FlowAgent 节点操作后的回调(由 `ChatContainer` / `MessageContainer` / `MessageRender` 透传):
|
|
249
|
-
|
|
250
|
-
```typescript
|
|
251
|
-
type OnInterruptResume = (
|
|
252
|
-
payload: InterruptResume,
|
|
253
|
-
interrupt?: Interrupt,
|
|
254
|
-
) => Promise<void> | void;
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
| 参数 | 说明 |
|
|
258
|
-
| ----------- | ---------------------------------------------------------------------------------------------------------- |
|
|
259
|
-
| `payload` | 用户操作产生的 resume 负载;通过 `payload.operation`(或 `UserQuestionResume.reason`)区分动作类型 |
|
|
260
|
-
| `interrupt` | 原始中断项;审批取消、用户问题等中断来源**必传**;FlowAgent 节点重试 / 跳过等非中断来源**不传** |
|
|
261
|
-
|
|
262
|
-
| `payload.operation` | 触发场景 | `interrupt` |
|
|
263
|
-
| -------------------------------- | -------------------------------- | ----------- |
|
|
264
|
-
| `approval_cancel` | `ToolApprovalCard` 取消审批 | 必传 |
|
|
265
|
-
| `flow_node_retry` / `flow_node_skip` | `FlowAgentContent` 失败节点操作 | 不传 |
|
|
266
|
-
| —(`UserQuestionResume`) | `UserQuestionCard` 提交回答 | 必传 |
|
|
267
|
-
|
|
268
|
-
## 使用示例
|
|
269
|
-
|
|
270
|
-
```typescript
|
|
271
|
-
import {
|
|
272
|
-
APPROVAL_STATUS,
|
|
273
|
-
InterruptReason,
|
|
274
|
-
InterruptResumeOperation,
|
|
275
|
-
MessageRole,
|
|
276
|
-
MessageStatus,
|
|
277
|
-
type InterruptMessage,
|
|
278
|
-
type OnInterruptResume,
|
|
279
|
-
} from '@blueking/chat-x';
|
|
280
|
-
|
|
281
|
-
const message: InterruptMessage = {
|
|
282
|
-
id: 'msg_interrupt_1',
|
|
283
|
-
messageId: 'msg_interrupt_1',
|
|
284
|
-
role: MessageRole.Interrupt,
|
|
285
|
-
status: MessageStatus.Pending,
|
|
286
|
-
content: {
|
|
287
|
-
message: '需要您处理以下中断',
|
|
288
|
-
outcome: {
|
|
289
|
-
type: 'interrupt',
|
|
290
|
-
interrupts: [
|
|
291
|
-
{
|
|
292
|
-
id: 'interrupt_approval_1',
|
|
293
|
-
reason: InterruptReason.AIDevToolApproval,
|
|
294
|
-
toolCallId: 'tool_call_approval_1',
|
|
295
|
-
metadata: {
|
|
296
|
-
ticket: {
|
|
297
|
-
approvers: ['张三'],
|
|
298
|
-
sn: 'REV-2026-04-24-001',
|
|
299
|
-
status: APPROVAL_STATUS.PENDING,
|
|
300
|
-
submit_time: '2026-04-24 14:30:15',
|
|
301
|
-
title: '算法方案评审单',
|
|
302
|
-
url: 'https://example.com/tickets/REV-2026-04-24-001',
|
|
303
|
-
},
|
|
304
|
-
},
|
|
305
|
-
},
|
|
306
|
-
{
|
|
307
|
-
id: 'interrupt_question_1',
|
|
308
|
-
reason: InterruptReason.UserQuestion,
|
|
309
|
-
toolCallId: 'tool_call_question_1',
|
|
310
|
-
message: '请选择实现方案',
|
|
311
|
-
metadata: {
|
|
312
|
-
questions: [
|
|
313
|
-
{
|
|
314
|
-
header: '请选择实现方案',
|
|
315
|
-
multiSelect: false,
|
|
316
|
-
question: '你希望采用哪种排序实现?',
|
|
317
|
-
options: [
|
|
318
|
-
{ label: 'basic', description: '基础冒泡排序' },
|
|
319
|
-
{ label: 'optimized', description: '提前终止优化版' },
|
|
320
|
-
],
|
|
321
|
-
},
|
|
322
|
-
],
|
|
323
|
-
},
|
|
324
|
-
},
|
|
325
|
-
],
|
|
326
|
-
},
|
|
327
|
-
},
|
|
328
|
-
};
|
|
329
|
-
|
|
330
|
-
const handleInterruptResume: OnInterruptResume = async (payload, interrupt) => {
|
|
331
|
-
if ('operation' in payload) {
|
|
332
|
-
switch (payload.operation) {
|
|
333
|
-
case InterruptResumeOperation.ApprovalCancel:
|
|
334
|
-
console.log('取消审批', payload.payload.interrupt_id, interrupt?.id);
|
|
335
|
-
break;
|
|
336
|
-
case InterruptResumeOperation.FlowNodeRetry:
|
|
337
|
-
case InterruptResumeOperation.FlowNodeSkip:
|
|
338
|
-
console.log('流程节点操作', payload.operation, payload.payload);
|
|
339
|
-
break;
|
|
340
|
-
}
|
|
341
|
-
return;
|
|
342
|
-
}
|
|
343
|
-
// UserQuestionResume
|
|
344
|
-
console.log('用户问题 resume', interrupt?.id, payload);
|
|
345
|
-
};
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
## 关联文档
|
|
349
|
-
|
|
350
|
-
- [常量枚举 Constants](./constants.md) — `InterruptReason`、`APPROVAL_STATUS`
|
|
351
|
-
- [消息类型 Messages](./messages.md) — `InterruptMessage` 在消息联合类型中的位置
|
|
352
|
-
- [InterruptMessage 中断消息](../components/agent/interrupt-message)
|
|
353
|
-
- [UserQuestionCard 用户问题中断](../components/agent/user-question-card)
|
|
354
|
-
- [ToolApprovalCard 审批卡片](../components/agent/tool-approval-card)
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
<!-- AI SUMMARY -->
|
|
2
|
-
## 快速了解
|
|
3
|
-
|
|
4
|
-
渲染知识召回活动,包含加载态、Markdown 内容与引用来源。 源码位置:src/components/chat-content/knowledge-rag-content/knowledge-rag-content.vue。
|
|
5
|
-
|
|
6
|
-
### 关联组件
|
|
7
|
-
- **activity-message** — activityType 为 knowledge_rag 时分发到本组件
|
|
8
|
-
- **activity-layout** — 提供可折叠的活动容器外壳
|
|
9
|
-
- **markdown-content** — 渲染知识召回摘要正文
|
|
10
|
-
- **reference-content** — 渲染召回引用来源列表
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
<!-- FULL DOC -->
|
|
14
|
-
|
|
15
|
-
# KnowledgeRagContent 知识召回内容
|
|
16
|
-
|
|
17
|
-
> **能力域**:Agent 能力
|
|
18
|
-
|
|
19
|
-
`KnowledgeRagContent` 用于渲染知识召回活动内容,包含活动标题、加载态、Markdown 摘要和引用来源列表。它是 `ActivityMessage` 在 `activityType === 'knowledge_rag'` 时使用的具体内容组件。
|
|
20
|
-
|
|
21
|
-
通常不需要直接使用,`MessageRender -> ActivityMessage` 会根据消息类型自动分发到本组件。
|
|
22
|
-
|
|
23
|
-
## 源码事实
|
|
24
|
-
|
|
25
|
-
- **源码位置**:`src/components/chat-content/knowledge-rag-content/knowledge-rag-content.vue`
|
|
26
|
-
- **能力说明**:渲染知识召回活动,包含加载态、Markdown 内容与引用来源。
|
|
27
|
-
|
|
28
|
-
## 核心能力
|
|
29
|
-
|
|
30
|
-
- **活动外壳**:基于 `ActivityLayout` 渲染可折叠活动区域,默认展开
|
|
31
|
-
- **状态标题**:`status` 为 `pending` / `streaming` 时标题显示“检索中”并展示 Loading;其他状态显示“检索完成”
|
|
32
|
-
- **Markdown 摘要**:使用 `MarkdownContent` 渲染 `content.content`
|
|
33
|
-
- **引用来源**:使用 `ReferenceContent` 渲染 `content.referenceDocument`
|
|
34
|
-
- **空值兜底**:正文缺失时传入空字符串,引用缺失时传入空数组
|
|
35
|
-
|
|
36
|
-
## 基础用法
|
|
37
|
-
|
|
38
|
-
```vue
|
|
39
|
-
<template>
|
|
40
|
-
<KnowledgeRagContent
|
|
41
|
-
v-model:collapsed="collapsed"
|
|
42
|
-
:content="content"
|
|
43
|
-
status="complete"
|
|
44
|
-
/>
|
|
45
|
-
</template>
|
|
46
|
-
|
|
47
|
-
<script setup lang="ts">
|
|
48
|
-
import { ref } from 'vue';
|
|
49
|
-
import KnowledgeRagContent from '@blueking/chat-x/src/components/chat-content/knowledge-rag-content/knowledge-rag-content.vue';
|
|
50
|
-
import type { KnowledgeRagMessageContent } from '@blueking/chat-x';
|
|
51
|
-
|
|
52
|
-
const collapsed = ref(false);
|
|
53
|
-
|
|
54
|
-
const content: KnowledgeRagMessageContent = {
|
|
55
|
-
content: '根据知识库检索,**蓝鲸智云** 常见 Agent 接入流程包括...',
|
|
56
|
-
referenceDocument: [
|
|
57
|
-
{ name: 'Agent 接入指南', url: 'https://example.com/agent-guide', originFile: 'https://example.com/docs/agent-guide' },
|
|
58
|
-
],
|
|
59
|
-
};
|
|
60
|
-
</script>
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
**渲染效果**
|
|
64
|
-
|
|
65
|
-
## 检索中状态
|
|
66
|
-
|
|
67
|
-
当消息状态为 `pending` 或 `streaming` 时,标题区域显示 Loading,标题文案为“检索中”。
|
|
68
|
-
|
|
69
|
-
## 折叠状态
|
|
70
|
-
|
|
71
|
-
`collapsed` 通过 `v-model:collapsed` 与 `ActivityLayout` 双向绑定,适合由父级活动消息统一控制展开/收起。
|
|
72
|
-
|
|
73
|
-
## API
|
|
74
|
-
|
|
75
|
-
### Props
|
|
76
|
-
|
|
77
|
-
| 属性名 | 类型 | 必填 | 默认值 | 说明 |
|
|
78
|
-
| ---------- | ---------------------------- | ---- | ------ | ---------------------------------------- |
|
|
79
|
-
| content | `KnowledgeRagMessageContent` | 否 | — | 知识召回摘要与引用来源 |
|
|
80
|
-
| messageUid | `string` | 否 | — | 所属消息唯一标识,当前组件暂未直接使用 |
|
|
81
|
-
| status | `MessageStatus` | 否 | — | 消息状态,影响标题文案与 Loading 显示 |
|
|
82
|
-
|
|
83
|
-
### Models
|
|
84
|
-
|
|
85
|
-
| 名称 | 类型 | 默认值 | 说明 |
|
|
86
|
-
| --------- | --------- | ------- | ---------------- |
|
|
87
|
-
| collapsed | `boolean` | `false` | 活动内容是否折叠 |
|
|
88
|
-
|
|
89
|
-
### Emits
|
|
90
|
-
|
|
91
|
-
- 无显式 emits;`v-model:collapsed` 会产生 `update:collapsed`。
|
|
92
|
-
|
|
93
|
-
### Slots
|
|
94
|
-
|
|
95
|
-
- 无。
|
|
96
|
-
|
|
97
|
-
### Expose
|
|
98
|
-
|
|
99
|
-
- 无。
|
|
100
|
-
|
|
101
|
-
## 类型定义
|
|
102
|
-
|
|
103
|
-
```typescript
|
|
104
|
-
export type KnowledgeRagMessageContent = {
|
|
105
|
-
content: string;
|
|
106
|
-
referenceDocument: ReferenceDocumentContent[];
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
export type ReferenceDocumentContent = {
|
|
110
|
-
name: string;
|
|
111
|
-
originFile: string;
|
|
112
|
-
url: string;
|
|
113
|
-
};
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
## 使用建议
|
|
117
|
-
|
|
118
|
-
- 业务接入时优先通过 [ActivityMessage](../message/activity-message.md) 或完整消息链路使用,避免重复判断 `activityType`。
|
|
119
|
-
- `referenceDocument` 为空时组件仍会渲染正文区域,引用列表由 `ReferenceContent` 处理空数组。
|
|
120
|
-
|
|
121
|
-
## 关联组件
|
|
122
|
-
|
|
123
|
-
- [ActivityMessage](../message/activity-message.md) — 活动消息分发入口。
|
|
124
|
-
- [ActivityLayout](../helper/activity-layout.md) — 折叠活动外壳。
|
|
125
|
-
- [MarkdownContent](../rendering/markdown-content.md) — Markdown 摘要渲染。
|
|
126
|
-
- [ReferenceContent](../rendering/reference-content.md) — 引用来源列表。
|