@blueking/chat-x 0.0.45-beta.6 → 0.0.45-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/ag-ui/types/constants.d.ts +16 -0
- package/dist/ag-ui/types/contents.d.ts +2 -0
- package/dist/ag-ui/types/index.d.ts +2 -0
- package/dist/ag-ui/types/interrupt.d.ts +152 -0
- package/dist/ag-ui/types/messages.d.ts +2 -0
- package/dist/ag-ui/types/schema.d.ts +42 -0
- package/dist/components/ai-questions/questions-container.vue.d.ts +3 -0
- package/dist/components/ai-questions/selection-question.vue.d.ts +3 -0
- package/dist/components/chat-content/flow-agent-content/flow-agent-content.vue.d.ts +3 -0
- package/dist/components/chat-content/flow-agent-content/use-flow-agent.d.ts +4 -0
- package/dist/components/chat-content/flow-agent-content/use-flow-node-actions.d.ts +32 -0
- package/dist/components/chat-content/index.d.ts +2 -0
- package/dist/components/chat-input/chat-input.vue.d.ts +14 -8
- package/dist/components/chat-input/input-attachment/input-attachment.vue.d.ts +1 -0
- package/dist/components/chat-input/input-info-alert.vue.d.ts +6 -0
- package/dist/components/chat-message/activity-message/activity-message.vue.d.ts +4 -1
- package/dist/components/chat-message/assistant-message/assistant-message.vue.d.ts +1 -1
- package/dist/components/chat-message/interrupt-message/index.d.ts +2 -0
- package/dist/components/chat-message/interrupt-message/interrupt-message.vue.d.ts +17 -0
- package/dist/components/chat-message/interrupt-message/tool-approval-card.vue.d.ts +9 -0
- package/dist/components/chat-message/interrupt-message/user-question/index.d.ts +5 -0
- package/dist/components/chat-message/interrupt-message/user-question/use-user-question.d.ts +35 -0
- package/dist/components/chat-message/interrupt-message/user-question/user-question-answered-card.vue.d.ts +25 -0
- package/dist/components/chat-message/interrupt-message/user-question/user-question-card.vue.d.ts +25 -0
- package/dist/components/chat-message/interrupt-message/user-question/user-question-choice.vue.d.ts +13 -0
- package/dist/components/chat-message/interrupt-message/user-question/user-question-option.vue.d.ts +17 -0
- package/dist/components/chat-message/message-container/message-container.vue.d.ts +14 -7
- package/dist/components/chat-message/message-render/message-render.vue.d.ts +4 -0
- package/dist/components/index.d.ts +3 -2
- package/dist/composables/use-global-config.d.ts +3 -0
- package/dist/composables/use-message-group.d.ts +2221 -354
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/interrupt.d.ts +24 -0
- package/dist/index.css +1 -1
- package/dist/index.js +2570 -1936
- package/dist/index.js.map +1 -1
- package/dist/lang/lang.d.ts +34 -2
- package/dist/mcp/generated/docs/activity-layout.md +138 -0
- package/dist/mcp/generated/docs/activity-message.md +21 -7
- package/dist/mcp/generated/docs/ai-image.md +9 -4
- package/dist/mcp/generated/docs/ai-loading.md +11 -6
- package/dist/mcp/generated/docs/ai-prompt-list.md +42 -0
- package/dist/mcp/generated/docs/ai-selection.md +10 -5
- package/dist/mcp/generated/docs/ai-slash-editor.md +43 -0
- package/dist/mcp/generated/docs/ai-slash-input.md +43 -0
- package/dist/mcp/generated/docs/ai-slash-menu.md +42 -0
- package/dist/mcp/generated/docs/animation-text.md +9 -4
- package/dist/mcp/generated/docs/assistant-message.md +10 -5
- package/dist/mcp/generated/docs/chat-container.md +173 -19
- package/dist/mcp/generated/docs/chat-input.md +78 -10
- package/dist/mcp/generated/docs/cite-content.md +8 -3
- package/dist/mcp/generated/docs/code-content.md +9 -4
- package/dist/mcp/generated/docs/common-error-content.md +10 -5
- package/dist/mcp/generated/docs/constants.md +68 -3
- package/dist/mcp/generated/docs/content-render.md +10 -5
- package/dist/mcp/generated/docs/delete-tool.md +9 -4
- package/dist/mcp/generated/docs/desc-panel.md +9 -4
- package/dist/mcp/generated/docs/detail-section.md +93 -0
- package/dist/mcp/generated/docs/execution-summary.md +10 -5
- package/dist/mcp/generated/docs/file-content.md +9 -4
- package/dist/mcp/generated/docs/file-upload-btn.md +10 -5
- package/dist/mcp/generated/docs/flow-agent-content.md +252 -0
- package/dist/mcp/generated/docs/flow-agent-node-detail.md +240 -0
- package/dist/mcp/generated/docs/highlight-keyword.md +10 -5
- package/dist/mcp/generated/docs/image-content.md +9 -4
- package/dist/mcp/generated/docs/image-preview-group.md +9 -4
- package/dist/mcp/generated/docs/image-preview.md +10 -5
- package/dist/mcp/generated/docs/info-message.md +7 -2
- package/dist/mcp/generated/docs/input-attachment.md +43 -0
- package/dist/mcp/generated/docs/input-info-alert.md +42 -0
- package/dist/mcp/generated/docs/interrupt-message.md +216 -0
- package/dist/mcp/generated/docs/interrupt.md +377 -0
- package/dist/mcp/generated/docs/key-value-content.md +9 -4
- package/dist/mcp/generated/docs/knowledge-rag-content.md +126 -0
- package/dist/mcp/generated/docs/latex-content.md +9 -4
- package/dist/mcp/generated/docs/loading-message.md +11 -6
- package/dist/mcp/generated/docs/markdown-container.md +1 -1
- package/dist/mcp/generated/docs/markdown-content.md +13 -8
- 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 +9 -4
- package/dist/mcp/generated/docs/message-container.md +69 -11
- package/dist/mcp/generated/docs/message-loading.md +120 -0
- package/dist/mcp/generated/docs/message-render.md +23 -11
- package/dist/mcp/generated/docs/message-tools.md +10 -5
- package/dist/mcp/generated/docs/messages.md +75 -11
- package/dist/mcp/generated/docs/overflow-tips.md +4 -4
- package/dist/mcp/generated/docs/preview-toolbar.md +42 -0
- package/dist/mcp/generated/docs/questions-container.md +88 -0
- package/dist/mcp/generated/docs/reasoning-message.md +10 -5
- package/dist/mcp/generated/docs/reference-content.md +10 -5
- package/dist/mcp/generated/docs/reference-doc-content.md +112 -0
- package/dist/mcp/generated/docs/schema.md +93 -0
- package/dist/mcp/generated/docs/scroll-btn.md +8 -3
- package/dist/mcp/generated/docs/selection-footer.md +9 -4
- package/dist/mcp/generated/docs/selection-question.md +91 -0
- package/dist/mcp/generated/docs/shortcut-btn.md +10 -5
- package/dist/mcp/generated/docs/shortcut-btns.md +10 -5
- package/dist/mcp/generated/docs/shortcut-render.md +10 -5
- package/dist/mcp/generated/docs/simple-table.md +103 -0
- package/dist/mcp/generated/docs/text-content.md +9 -4
- package/dist/mcp/generated/docs/theme.md +50 -4
- package/dist/mcp/generated/docs/tool-approval-card.md +164 -0
- package/dist/mcp/generated/docs/tool-btn.md +9 -4
- package/dist/mcp/generated/docs/tool-message.md +10 -5
- package/dist/mcp/generated/docs/toolcall-render.md +10 -5
- 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-flow-node-actions.md +124 -0
- package/dist/mcp/generated/docs/use-full-screen.md +3 -3
- package/dist/mcp/generated/docs/use-global-config.md +20 -5
- package/dist/mcp/generated/docs/use-menu-keydown.md +1 -1
- package/dist/mcp/generated/docs/use-message-group.md +40 -9
- package/dist/mcp/generated/docs/use-observer-visible-list.md +1 -1
- package/dist/mcp/generated/docs/user-feedback.md +8 -3
- package/dist/mcp/generated/docs/user-message.md +10 -5
- package/dist/mcp/generated/docs/user-question-answered-card.md +106 -0
- package/dist/mcp/generated/docs/user-question-card.md +228 -0
- package/dist/mcp/generated/docs/user-question-choice.md +108 -0
- package/dist/mcp/generated/docs/user-question-option.md +42 -0
- package/dist/mcp/generated/docs/vnode-renderer.md +126 -0
- package/dist/mcp/generated/index.json +1105 -562
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/list-components.d.ts +7 -6
- package/dist/mcp/tools/list-components.js +23 -29
- 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/dist/utils/utils.d.ts +2 -2
- package/package.json +4 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- AI SUMMARY -->
|
|
2
2
|
## 快速了解
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
完整对话容器,组合消息列表、输入区、快捷指令、执行摘要、分享选择和自定义 Tab。 源码位置:src/components/chat-container/chat-container.vue。
|
|
5
5
|
|
|
6
6
|
### 关联组件
|
|
7
7
|
- **message-container** — 消息列表与滚动区域
|
|
@@ -14,8 +14,13 @@ ChatContainer 提供完整 AI 对话布局:分栏(ResizeLayout)、消息
|
|
|
14
14
|
<!-- FULL DOC -->
|
|
15
15
|
|
|
16
16
|
# ChatContainer 聊天容器
|
|
17
|
+
## 源码事实
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
- **源码位置**:`src/components/chat-container/chat-container.vue`
|
|
20
|
+
- **能力域**:对话搭建
|
|
21
|
+
- **能力说明**:完整对话容器,组合消息列表、输入区、快捷指令、执行摘要、分享选择和自定义 Tab。
|
|
22
|
+
|
|
23
|
+
> **能力域**:对话搭建
|
|
19
24
|
|
|
20
25
|
顶层聊天容器组件,整合了 `MessageContainer`(消息列表)、`ChatInput`(输入框)、`ExecutionSummary`(执行摘要面板)、`ShortcutRender`(快捷指令表单)和 `SelectionFooter`(多选操作栏)。提供完整的 AI 对话界面布局能力。
|
|
21
26
|
|
|
@@ -24,17 +29,20 @@ ChatContainer 提供完整 AI 对话布局:分栏(ResizeLayout)、消息
|
|
|
24
29
|
- **分栏布局**:基于 `ResizeLayout` 的可拖拽分栏;**侧栏是否展示 Tab / 执行摘要、以及分栏是否进入折叠样式(`ai-is-collapse`)以 `executionGroups` 与执行情况搜索关键词 `keyword` 共同决定**(`executionGroups` 由 `useMessageGroup` 从消息中过滤工具调用与 FlowAgent 记录;`keyword` 来自 `ExecutionSummary` 的 `@update-keyword`)。当 `executionGroups` 为空且未输入搜索词时,侧栏 Tab 与执行摘要不展示;**用户正在搜索执行情况时(`keyword` 非空),即使暂无执行类消息也会保留侧栏**,避免搜索态被折叠
|
|
25
30
|
- **消息分组**:内置 `useMessageGroup` 自动处理消息分组、Tool 合并、Loading 注入
|
|
26
31
|
- **输入区状态推导**:传给 `MessageContainer` 与 `ChatInput` 的 `messageStatus` 为内部计算值 `inputStatus`:当分组中存在 id 为 `LOADING_MESSAGE_ID`(`'__loading__'`,由 `useMessageGroup` 注入的占位 Loading 消息)时,对内使用 `MessageStatus.Fetching`;否则使用外部传入的 `messageStatus`。用于在「已发用户消息、尚未流式」阶段与流式中一致地展示停止能力,并避免输入区重复发送
|
|
32
|
+
- **待审批发送阻塞**:当消息中存在 `AIDevToolApproval` 且状态为 `pending` / `draft` 的中断项时,`useMessageGroup` 会返回待审批提示,容器在输入区上方展示提示并通过 `ChatInput.sendDisabledTip` 禁止继续发送
|
|
33
|
+
- **用户问题中断**:当消息中存在待回答 `UserQuestion` 中断时,容器会在输入区上方挂载 `UserQuestionCard`;结构化作答走 `onInterruptResume`,用户在输入框直接发送时走 `onSendMessage` 并在第三参数附带 skip 用的 `payload`(`status: 'cancelled'`)与 `interrupt`,且不会自动清空输入框
|
|
27
34
|
- **执行摘要**:侧边栏展示工具调用 / FlowAgent 执行记录,支持关键词搜索和对话定位
|
|
28
35
|
- **侧栏全屏**:Tab 栏右侧提供全屏/退出全屏按钮,基于 `useFullScreen` 将侧栏区域(`.ai-full-screen-wrapper`)以浏览器原生全屏展示;全屏时 Tippy 的 `appendTo` 自动切换为全屏容器,避免 tooltip 被遮挡
|
|
29
36
|
- **自定义 Tab**:通过 `useCustomTabProvider` 支持动态添加自定义 Tab(如节点详情)
|
|
30
37
|
- **分享模式**:内置消息多选分享流程,选中用户消息后确认分享
|
|
31
38
|
- **渲染模式注入**:`renderMode` 会通过内部 Provider 下传给后代内容组件;例如 FlowAgent 节点在 `Share` 模式下隐藏耗时和「详情」入口
|
|
39
|
+
- **字号主题**:通过 `size` 控制 `small`(默认 12px)/ `normal`(14px)两档字号;根节点设置 `data-ai-size`,子组件通过 CSS 变量(`--ai-font-size` 等)响应式缩放;浮层(Tippy / Teleport)会同步 `document.body.dataset.aiSize`,卸载时自动清理
|
|
32
40
|
- **空状态欢迎页**:无消息时展示欢迎语和开场白
|
|
33
41
|
|
|
34
42
|
## 组件结构
|
|
35
43
|
|
|
36
44
|
```
|
|
37
|
-
ai-chat-container
|
|
45
|
+
ai-chat-container(:data-ai-size="size")
|
|
38
46
|
├── Loading(chatLoading 时)
|
|
39
47
|
└── ResizeLayout
|
|
40
48
|
├── aside(侧边栏)
|
|
@@ -48,12 +56,14 @@ ai-chat-container
|
|
|
48
56
|
│ └── collapse-button(折叠按钮,CollapsedIcon;折叠时图标旋转,hover 高亮 #3a84ff)
|
|
49
57
|
└── main(主内容区)
|
|
50
58
|
├── MessageContainer(有消息时)
|
|
59
|
+
│ ├── #group 插槽(可选,自定义消息组内容)
|
|
60
|
+
│ ├── #message 插槽(可选,自定义单条消息)
|
|
51
61
|
│ └── 消息列表 + 工具栏
|
|
52
62
|
├── 欢迎页(无消息时,容器 .ai-welcome-content)
|
|
53
63
|
│ └── welcome 插槽(默认:Banner + 欢迎标题 + 开场白 ContentRender;自定义则整块替换)
|
|
54
64
|
├── SelectionFooter(分享模式时)
|
|
55
65
|
├── ShortcutRender(有快捷指令时)
|
|
56
|
-
└── ChatInput
|
|
66
|
+
└── ChatInput(默认状态,待审批时通过 interrupt slot 展示 InputInfoAlert)
|
|
57
67
|
```
|
|
58
68
|
|
|
59
69
|
## 基础用法
|
|
@@ -108,6 +118,26 @@ ai-chat-container
|
|
|
108
118
|
|
|
109
119
|
**渲染效果**
|
|
110
120
|
|
|
121
|
+
## 字号主题
|
|
122
|
+
|
|
123
|
+
通过 `size` 切换两档字号主题。未传时默认为 `small`(12px 基准字号);设为 `normal` 时使用 14px 基准字号,并联动行高、间距与图标尺寸。
|
|
124
|
+
|
|
125
|
+
```vue
|
|
126
|
+
<template>
|
|
127
|
+
<ChatContainer
|
|
128
|
+
v-model="inputValue"
|
|
129
|
+
:messages="messages"
|
|
130
|
+
message-status="complete"
|
|
131
|
+
size="normal"
|
|
132
|
+
:on-send-message="handleSendMessage"
|
|
133
|
+
/>
|
|
134
|
+
</template>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**渲染效果**(左右对比 `size="small"` 与 `size="normal"`)
|
|
138
|
+
|
|
139
|
+
> CSS 变量与档位取值详见 [主题配置 — 字号主题](../../theme/theme#字号主题)。
|
|
140
|
+
|
|
111
141
|
## 侧边栏与执行摘要
|
|
112
142
|
|
|
113
143
|
侧边栏默认包含「执行情况」Tab,展示所有工具调用和 FlowAgent 类型的 Activity 消息。支持关键词搜索过滤和点击定位到对话中的消息位置。
|
|
@@ -317,6 +347,113 @@ ai-chat-container
|
|
|
317
347
|
|
|
318
348
|
`messageStatus` 为 `streaming` 时,底部固定区域显示「停止生成」按钮,点击后触发 `@stop-streaming` 事件:
|
|
319
349
|
|
|
350
|
+
## 待审批阻塞发送
|
|
351
|
+
|
|
352
|
+
当会话中存在待审批的 AI Dev 工具审批中断时,`ChatContainer` 会在输入框上方展示提示,并禁用发送按钮。用户需要在审批卡片中点击「取消审批」或等待状态变化后,才能继续发送新消息。
|
|
353
|
+
|
|
354
|
+
```vue
|
|
355
|
+
<template>
|
|
356
|
+
<ChatContainer
|
|
357
|
+
v-model="inputValue"
|
|
358
|
+
:messages="messages"
|
|
359
|
+
message-status="complete"
|
|
360
|
+
:on-interrupt-resume="handleInterruptResume"
|
|
361
|
+
:on-send-message="handleSendMessage"
|
|
362
|
+
:on-stop-sending="handleStopSending"
|
|
363
|
+
/>
|
|
364
|
+
</template>
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
**渲染效果**(待审批单存在时,输入区上方展示提示,发送按钮置灰)
|
|
368
|
+
|
|
369
|
+
## 用户问题中断
|
|
370
|
+
|
|
371
|
+
当会话中最近一条待处理 interrupt 包含 `InterruptReason.UserQuestion` 时,`ChatContainer` 会在 `ChatInput` 上方显示 [UserQuestionCard](/components/agent/user-question-card)。
|
|
372
|
+
|
|
373
|
+
- **结构化作答**:用户在卡片内完成选择或点击「跳过」后,通过 `onInterruptResume(payload, interrupt)` 回传 `UserQuestionResume`。
|
|
374
|
+
- **输入框发送**:用户也可在输入框直接点击发送;容器会调用 `onSendMessage(content, docSchema, options)`,其中 `options.interrupt` 为当前激活的 UserQuestion,`options.payload` 为 `buildSkipResumePayload` 生成的 skip resume(`status: 'cancelled'`,`answers: []`)。此时**不会自动清空**输入框,由业务侧在 `onSendMessage` 内决定如何处理 `content` 与中断恢复。
|
|
375
|
+
|
|
376
|
+
```vue
|
|
377
|
+
<template>
|
|
378
|
+
<ChatContainer
|
|
379
|
+
v-model="inputValue"
|
|
380
|
+
:messages="messages"
|
|
381
|
+
message-status="complete"
|
|
382
|
+
:on-interrupt-resume="handleInterruptResume"
|
|
383
|
+
:on-send-message="handleSendMessage"
|
|
384
|
+
/>
|
|
385
|
+
</template>
|
|
386
|
+
|
|
387
|
+
<script setup lang="ts">
|
|
388
|
+
import {
|
|
389
|
+
type OnInterruptResume,
|
|
390
|
+
type UserMessage,
|
|
391
|
+
type TagSchema,
|
|
392
|
+
type Interrupt,
|
|
393
|
+
type InterruptResume,
|
|
394
|
+
} from '@blueking/chat-x';
|
|
395
|
+
|
|
396
|
+
const handleInterruptResume: OnInterruptResume = async (payload, interrupt) => {
|
|
397
|
+
// UserQuestionCard 完成 / 跳过时 payload 为 UserQuestionResume
|
|
398
|
+
await resumeAgent({ interruptId: interrupt.id, resume: payload });
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
const handleSendMessage = async (
|
|
402
|
+
content: UserMessage['content'],
|
|
403
|
+
docSchema: TagSchema,
|
|
404
|
+
options?: { interrupt?: Interrupt; payload?: InterruptResume },
|
|
405
|
+
) => {
|
|
406
|
+
if (options?.interrupt && options?.payload) {
|
|
407
|
+
// 存在 UserQuestion 时发送:附带 skip resume,content 仍为输入框文本
|
|
408
|
+
await resumeAgent({ interruptId: options.interrupt.id, resume: options.payload });
|
|
409
|
+
// 业务侧自行决定是否将 content 作为新用户消息继续发送
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
await sendMessage(content, docSchema);
|
|
413
|
+
};
|
|
414
|
+
</script>
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
## 自定义消息组渲染
|
|
418
|
+
|
|
419
|
+
通过 `#group` 插槽可替换单个消息组的默认内容,透传至内部 `MessageContainer`。外层消息组容器(`id`、hover、选中背景)仍由 `MessageContainer` 管理。
|
|
420
|
+
|
|
421
|
+
> **注意**:提供 `#group` 后需自行编排组内全部 UI(Checkbox、消息列表、`MessageTools`);若只需替换单条消息,请使用 `#message` 插槽。详见 [MessageContainer 自定义消息组渲染](/components/setup/message-container#自定义消息组渲染)。
|
|
422
|
+
|
|
423
|
+
```vue
|
|
424
|
+
<ChatContainer
|
|
425
|
+
v-model="inputValue"
|
|
426
|
+
:messages="messages"
|
|
427
|
+
message-status="complete"
|
|
428
|
+
:on-send-message="handleSendMessage"
|
|
429
|
+
>
|
|
430
|
+
<template #group="{ group }">
|
|
431
|
+
<MyCustomGroup :group="group" />
|
|
432
|
+
</template>
|
|
433
|
+
</ChatContainer>
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
### 自定义题目渲染
|
|
437
|
+
|
|
438
|
+
通过 `#interruptQuestion` slot 可覆盖输入区上方 `UserQuestionCard` 的默认选择题渲染,参数与 [UserQuestionCard](/components/agent/user-question-card) 的 `#question` 一致:
|
|
439
|
+
|
|
440
|
+
```vue
|
|
441
|
+
<ChatContainer
|
|
442
|
+
v-model="inputValue"
|
|
443
|
+
:messages="messages"
|
|
444
|
+
:on-interrupt-resume="handleInterruptResume"
|
|
445
|
+
:on-send-message="handleSendMessage"
|
|
446
|
+
>
|
|
447
|
+
<template #interruptQuestion="{ question, qIndex, answer, setAnswer, confirm }">
|
|
448
|
+
<MyCustomForm
|
|
449
|
+
:model="question"
|
|
450
|
+
@change="setAnswer"
|
|
451
|
+
@submit="confirm"
|
|
452
|
+
/>
|
|
453
|
+
</template>
|
|
454
|
+
</ChatContainer>
|
|
455
|
+
```
|
|
456
|
+
|
|
320
457
|
## 分享模式
|
|
321
458
|
|
|
322
459
|
点击消息工具栏的「分享」按钮后进入分享模式,底部出现 `SelectionFooter` 操作栏:
|
|
@@ -400,10 +537,11 @@ ChatContainer 的 Props 继承自 `ChatInputProps` 和 `MessageContainerProps`
|
|
|
400
537
|
| getSideTabRenderComponent | `(h, tab, { removeCustomTab }) => VNode \| undefined` | — | 自定义侧栏 Tab 标签渲染;未返回时使用默认图标 + 文案 + 关闭按钮 |
|
|
401
538
|
| openingRemark | `string` | — | 开场白,无消息时显示,支持 Markdown |
|
|
402
539
|
| placement | `'left' \| 'right'` | `'left'` | 侧边栏位置 |
|
|
540
|
+
| size | `'normal' \| 'small'` | `'small'` | 字号主题档位:`small` 为 12px 基准,`normal` 为 14px 基准;根节点设置 `data-ai-size` 并注入 `useGlobalConfig` |
|
|
403
541
|
| resizeProps | `{ disabled?: boolean; initialDivide?: number \| string; max?: number; min?: number }` | — | 透传给内部 `ResizeLayout` 的可选配置,与默认 `collapsible: false`、`immediate: true`、`min: 400` 合并;`placement` 始终取自本组件 `placement`;`initialDivide` 可为像素数字或百分比等字符串(与 bkui ResizeLayout 一致) |
|
|
404
542
|
| onCustomTabChange | `(tab: CustomTab) => Promise<any>` | — | 自定义 Tab 切换回调,返回值作为 Tab 组件 props |
|
|
405
543
|
|
|
406
|
-
> 完整 Props 列表请参考 [ChatInput](
|
|
544
|
+
> 完整 Props 列表请参考 [ChatInput](/components/input/chat-input) 和 [MessageContainer](/components/setup/message-container) 文档。
|
|
407
545
|
|
|
408
546
|
### v-model
|
|
409
547
|
|
|
@@ -428,12 +566,14 @@ ChatContainer 的 Props 继承自 `ChatInputProps` 和 `MessageContainerProps`
|
|
|
428
566
|
|
|
429
567
|
### Slots
|
|
430
568
|
|
|
431
|
-
| 插槽名
|
|
432
|
-
|
|
|
433
|
-
| codeHeader
|
|
434
|
-
| default
|
|
435
|
-
|
|
|
436
|
-
|
|
|
569
|
+
| 插槽名 | 参数 | 说明 |
|
|
570
|
+
| ----------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
|
|
571
|
+
| codeHeader | `{ language: string; token: Token[] }` | 代码块头部自定义操作区域,透传给 MessageRender → ContentRender → MarkdownContent → CodeContent |
|
|
572
|
+
| default | 消息列表相关绑定(messages 等) | 自定义消息列表区域 |
|
|
573
|
+
| group | `{ group: MessageGroup }` | 自定义单个消息组内容,透传至 MessageContainer 的 `#group`;替换默认 Checkbox、消息列表与工具栏 |
|
|
574
|
+
| interruptQuestion | `{ question, qIndex, answer, setAnswer, confirm }` | 自定义 UserQuestion 单题渲染,透传至输入区上方 UserQuestionCard 的 `#question` |
|
|
575
|
+
| message | `{ message, messageToolsStatus, onInterruptResume }` | 自定义单条消息渲染;自定义渲染中断消息时需继续透传 `onInterruptResume` |
|
|
576
|
+
| welcome | `{ openingRemark: string }` | 无消息时自定义欢迎页;传入则替换默认 Banner、标题与开场白区域(整块替换) |
|
|
437
577
|
|
|
438
578
|
### Expose
|
|
439
579
|
|
|
@@ -478,7 +618,19 @@ ChatContainer 的 Props 继承自 `ChatInputProps` 和 `MessageContainerProps`
|
|
|
478
618
|
## 类型定义
|
|
479
619
|
|
|
480
620
|
```typescript
|
|
481
|
-
import { ChatContainer, RenderMode, type CustomTab, type Shortcut, type Message } from '@blueking/chat-x';
|
|
621
|
+
import { ChatContainer, RenderMode, MessageRole, type CustomTab, type MessageGroup, type Shortcut, type Message } from '@blueking/chat-x';
|
|
622
|
+
|
|
623
|
+
// 消息组(由 useMessageGroup 生成)
|
|
624
|
+
interface MessageGroup {
|
|
625
|
+
checked: boolean;
|
|
626
|
+
isHover: boolean;
|
|
627
|
+
messages: Message[];
|
|
628
|
+
pause?: boolean;
|
|
629
|
+
startTime?: number;
|
|
630
|
+
type: MessageRole;
|
|
631
|
+
uid: string;
|
|
632
|
+
userMessageTitle?: number | string;
|
|
633
|
+
}
|
|
482
634
|
|
|
483
635
|
// 自定义 Tab(data 可与 messageUid 组合,供侧栏定位主对话)
|
|
484
636
|
interface CustomTab<T = Record<string, unknown>> {
|
|
@@ -497,10 +649,12 @@ interface Shortcut {
|
|
|
497
649
|
|
|
498
650
|
## 关联组件
|
|
499
651
|
|
|
500
|
-
- [MessageContainer](
|
|
501
|
-
- [ChatInput](
|
|
502
|
-
- [ShortcutRender](
|
|
503
|
-
- [ExecutionSummary](
|
|
504
|
-
- [SelectionFooter](
|
|
505
|
-
- [ToolBtn](
|
|
506
|
-
- [useFullScreen](
|
|
652
|
+
- [MessageContainer](/components/setup/message-container) — 消息列表区域
|
|
653
|
+
- [ChatInput](/components/input/chat-input) — 输入与快捷指令
|
|
654
|
+
- [ShortcutRender](/components/input/shortcut-render) — 快捷指令表单
|
|
655
|
+
- [ExecutionSummary](/components/agent/execution-summary) — 执行摘要侧栏
|
|
656
|
+
- [SelectionFooter](/components/input/selection-footer) — 多选操作栏
|
|
657
|
+
- [ToolBtn](/components/feedback/tool-btn) — 侧栏全屏按钮(自定义插槽)
|
|
658
|
+
- [useFullScreen](/composables/use-full-screen) — 侧栏全屏控制
|
|
659
|
+
- [useGlobalConfig](/composables/use-global-config) — 注入 `size` 与 `supportUpload`
|
|
660
|
+
- [主题配置](/theme/theme) — 字号主题 CSS 变量
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- AI SUMMARY -->
|
|
2
2
|
## 快速了解
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
聊天输入区,组合富文本输入、快捷指令、附件、引用、发送/停止等交互。 源码位置:src/components/chat-input/chat-input.vue。
|
|
5
5
|
|
|
6
6
|
### 关联组件
|
|
7
7
|
- **shortcut-btns** — 底部附件区默认展示的快捷指令列表
|
|
@@ -14,8 +14,13 @@ ChatInput 是聊天主输入区,集成富文本编辑(/ 提示词模板、@
|
|
|
14
14
|
<!-- FULL DOC -->
|
|
15
15
|
|
|
16
16
|
# ChatInput 聊天输入框
|
|
17
|
+
## 源码事实
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
- **源码位置**:`src/components/chat-input/chat-input.vue`
|
|
20
|
+
- **能力域**:输入交互
|
|
21
|
+
- **能力说明**:聊天输入区,组合富文本输入、快捷指令、附件、引用、发送/停止等交互。
|
|
22
|
+
|
|
23
|
+
> **能力域**:输入交互
|
|
19
24
|
|
|
20
25
|
聊天消息输入框组件,支持快捷指令选择、资源 `@` 引用、Prompt `/` 模板、消息引用、文件上传(拖拽/粘贴/点击)等功能。
|
|
21
26
|
|
|
@@ -24,6 +29,7 @@ ChatInput 是聊天主输入区,集成富文本编辑(/ 提示词模板、@
|
|
|
24
29
|
```
|
|
25
30
|
chat-input-container
|
|
26
31
|
├── slot#top(容器顶部,在输入框框体外侧)
|
|
32
|
+
├── slot#interrupt(容器顶部,在输入框框体外侧,通常展示中断/审批提示)
|
|
27
33
|
└── chat-input(框体,受 inputMaxHeight 控制)
|
|
28
34
|
├── slot#input-header(默认:cite 不为空时渲染引用区)
|
|
29
35
|
├── slot#files(默认:有上传文件时渲染文件预览区)
|
|
@@ -87,6 +93,53 @@ chat-input-container
|
|
|
87
93
|
|
|
88
94
|
> **实现细节**:组件内部用 `messageState` 计算属性决定实际按钮状态:当 `messageStatus` 为 `pending`、`streaming` 或 `fetching` 时直接使用该状态(确保停止按钮始终可用);否则当输入为空或仅含空白字符时强制为 `disabled`,其余情况使用 `messageStatus` 的值。`fetching` 时按 Enter **不会**触发发送(避免请求中与 Loading 占位阶段重复提交)。
|
|
89
95
|
|
|
96
|
+
### onSendMessage 第三参数 options(UserQuestion 上下文)
|
|
97
|
+
|
|
98
|
+
`ChatInput` 自身调用 `onSendMessage` 时只传前两个参数。当组件被 [ChatContainer](/components/setup/chat-container) 包裹且存在待回答 `UserQuestion` 中断时,容器会在用户点击发送时注入第三个参数:
|
|
99
|
+
|
|
100
|
+
| 字段 | 类型 | 说明 |
|
|
101
|
+
| ----------- | ------------------ | -------------------------------------------------------------------- |
|
|
102
|
+
| `interrupt` | `Interrupt` | 当前激活的 `UserQuestionInterrupt` |
|
|
103
|
+
| `payload` | `InterruptResume` | skip resume(`status: 'cancelled'`,`payload.answers` 为空数组) |
|
|
104
|
+
|
|
105
|
+
此场景下容器**不会**自动清空 `modelValue`,业务侧需在 `onSendMessage` 内自行处理消息发送与 `resumeAgent` 的先后顺序。结构化作答仍通过 `UserQuestionCard` → `onInterruptResume` 完成。
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
const handleSendMessage = async (
|
|
109
|
+
content: UserMessage['content'],
|
|
110
|
+
docSchema: TagSchema,
|
|
111
|
+
options?: { interrupt?: Interrupt; payload?: InterruptResume },
|
|
112
|
+
) => {
|
|
113
|
+
if (options?.interrupt && options?.payload) {
|
|
114
|
+
await resumeAgent({ interruptId: options.interrupt.id, resume: options.payload });
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
await sendMessage(content, docSchema);
|
|
118
|
+
};
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### sendDisabledTip(业务阻塞发送)
|
|
122
|
+
|
|
123
|
+
当业务侧需要临时阻止发送但仍允许用户输入时,可传入 `sendDisabledTip`。组件会置灰发送按钮,按钮 tooltip 展示该文案,并拦截点击发送、按 Enter 发送和 `triggerSendMessage()`:
|
|
124
|
+
|
|
125
|
+
```vue
|
|
126
|
+
<template>
|
|
127
|
+
<ChatInput
|
|
128
|
+
v-model="inputValue"
|
|
129
|
+
message-status="complete"
|
|
130
|
+
:send-disabled-tip="interruptTip"
|
|
131
|
+
:on-send-message="handleSendMessage"
|
|
132
|
+
:on-stop-sending="handleStopSending"
|
|
133
|
+
>
|
|
134
|
+
<template #interrupt>
|
|
135
|
+
<div class="input-alert">{{ interruptTip }}</div>
|
|
136
|
+
</template>
|
|
137
|
+
</ChatInput>
|
|
138
|
+
</template>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**渲染效果**
|
|
142
|
+
|
|
90
143
|
### Complete(可发送)
|
|
91
144
|
|
|
92
145
|
### Streaming(流式输出中,显示停止按钮)
|
|
@@ -370,11 +423,12 @@ chat-input-container
|
|
|
370
423
|
|
|
371
424
|
## 自定义插槽
|
|
372
425
|
|
|
373
|
-
组件提供
|
|
426
|
+
组件提供 6 个插槽用于自定义各区域内容:
|
|
374
427
|
|
|
375
428
|
| 插槽名 | 位置 | 默认行为 |
|
|
376
429
|
| -------------- | ------------------------------------------ | ------------------------------------------ |
|
|
377
430
|
| `top` | 框体外部顶部(`.chat-input` 上方) | 无 |
|
|
431
|
+
| `interrupt` | 框体外部顶部,位于 `top` 之后 | 无,通常用于展示审批/中断提示 |
|
|
378
432
|
| `input-header` | 框体内部顶部(编辑器上方) | `cite` 不为空时渲染引用区(`CiteContent`) |
|
|
379
433
|
| `files` | 文件预览区 | 有上传文件时渲染 `FileContent` |
|
|
380
434
|
| `attachment` | 底部工具栏快捷指令区(FileUploadBtn 右侧) | 快捷指令按钮列表 / 已选快捷指令 |
|
|
@@ -393,6 +447,11 @@ chat-input-container
|
|
|
393
447
|
<div class="input-tips">当前模型: GPT-4 · 剩余 Token: 12,800</div>
|
|
394
448
|
</template>
|
|
395
449
|
|
|
450
|
+
<!-- 框体外顶部,适合展示中断、审批等业务提示 -->
|
|
451
|
+
<template #interrupt>
|
|
452
|
+
<div class="input-alert">当前会话有待审批单,暂时不能继续发送</div>
|
|
453
|
+
</template>
|
|
454
|
+
|
|
396
455
|
<!-- 替换引用区,可自定义引用样式 -->
|
|
397
456
|
<template #input-header>
|
|
398
457
|
<div class="custom-header">自定义头部内容</div>
|
|
@@ -422,7 +481,7 @@ chat-input-container
|
|
|
422
481
|
</template>
|
|
423
482
|
```
|
|
424
483
|
|
|
425
|
-
|
|
484
|
+
**渲染效果**(顶部自定义模型信息与中断提示)
|
|
426
485
|
|
|
427
486
|
## Expose(模板引用)
|
|
428
487
|
|
|
@@ -467,9 +526,10 @@ chat-input-container
|
|
|
467
526
|
| placeholder | `string` | 见默认值 | - | 编辑器占位符,支持多行 |
|
|
468
527
|
| inputMaxHeight | `number` | `200` | - | 框体最大高度(px),有文件时自动加上文件预览区高度 |
|
|
469
528
|
| defaultUploadFiles | `UploadFile[]` | - | - | 预设已上传的文件列表 |
|
|
529
|
+
| sendDisabledTip | `string` | - | - | 业务阻塞发送时的 tooltip 提示;传入后发送按钮置灰,点击、Enter 与 `triggerSendMessage()` 均不会发送 |
|
|
470
530
|
| supportUpload | `boolean` | `true` | - | 是否显示文件上传按钮 |
|
|
471
531
|
| tippyOptions | `AITippyProps` | — | - | 透传给 FileUploadBtn 和 InputAttachment 的 tooltip 配置 |
|
|
472
|
-
| onSendMessage | `(content: UserMessage['content'], docSchema: TagSchema) => Promise<void>` | - | - | 发送消息回调,无文件时 content
|
|
532
|
+
| onSendMessage | `(content: UserMessage['content'], docSchema: TagSchema, options?: { interrupt?: Interrupt; payload?: InterruptResume }) => Promise<void>` | - | - | 发送消息回调,无文件时 content 为字符串,有文件时为数组;经 [ChatContainer](/components/setup/chat-container) 使用时,存在待回答 UserQuestion 会传入第三参数 `options` |
|
|
473
533
|
| onStopSending | `() => Promise<void>` | - | - | 停止发送回调,点击停止按钮时触发 |
|
|
474
534
|
| onUpload | `(file: File) => Promise<{ download_url?: string }>` | - | - | 文件上传回调(每次单文件) |
|
|
475
535
|
|
|
@@ -494,6 +554,7 @@ chat-input-container
|
|
|
494
554
|
| 插槽名 | 参数 | 说明 |
|
|
495
555
|
| ------------ | ---------------------------------- | ---------------------------------------------------------- |
|
|
496
556
|
| top | - | 框体(`.chat-input`)外部顶部,适合展示模型/Token 信息 |
|
|
557
|
+
| interrupt | - | 框体外部顶部,位于 `top` 后,适合展示审批/中断提示 |
|
|
497
558
|
| input-header | - | 框体内顶部,替换引用区(`CiteContent`) |
|
|
498
559
|
| files | `{ files: Partial<UploadFile>[] }` | 文件预览区 |
|
|
499
560
|
| attachment | - | 底部快捷指令区,`FileUploadBtn` 在其左侧,不受此 slot 影响 |
|
|
@@ -564,6 +625,13 @@ type SendContent =
|
|
|
564
625
|
// 有文件时:数组
|
|
565
626
|
{ type: 'binary'; url?: string; mimeType: string; filename: string } | { type: 'text'; text: string }
|
|
566
627
|
>;
|
|
628
|
+
|
|
629
|
+
// onSendMessage 完整签名(第三参数由 ChatContainer 在 UserQuestion 场景注入)
|
|
630
|
+
type OnSendMessage = (
|
|
631
|
+
content: SendContent,
|
|
632
|
+
docSchema: TagSchema,
|
|
633
|
+
options?: { interrupt?: Interrupt; payload?: InterruptResume },
|
|
634
|
+
) => Promise<void>;
|
|
567
635
|
```
|
|
568
636
|
|
|
569
637
|
## 完整集成示例
|
|
@@ -628,8 +696,8 @@ type SendContent =
|
|
|
628
696
|
|
|
629
697
|
## 关联组件
|
|
630
698
|
|
|
631
|
-
- [ShortcutBtns](
|
|
632
|
-
- [ShortcutBtn](
|
|
633
|
-
- [ShortcutRender](
|
|
634
|
-
- [ChatContainer](
|
|
635
|
-
- [CiteContent](
|
|
699
|
+
- [ShortcutBtns](/components/input/shortcut-btns) — 底部附件区默认快捷指令列表
|
|
700
|
+
- [ShortcutBtn](/components/input/shortcut-btn) — 已选快捷指令单按钮展示
|
|
701
|
+
- [ShortcutRender](/components/input/shortcut-render) — 含表单的快捷指令表单渲染
|
|
702
|
+
- [ChatContainer](/components/setup/chat-container) — 顶层布局中包裹输入区
|
|
703
|
+
- [CiteContent](/components/rendering/cite-content) — 消息引用区内容展示
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- AI SUMMARY -->
|
|
2
2
|
## 快速了解
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
渲染输入或消息中的引用片段。 源码位置:src/components/chat-content/cite-content/cite-content.vue。
|
|
5
5
|
|
|
6
6
|
### 关联组件
|
|
7
7
|
- **chat-input** — 输入区展示待发送引用内容
|
|
@@ -10,8 +10,13 @@ CiteContent 在输入区上方以紧凑条带展示被引用文本片段,单
|
|
|
10
10
|
<!-- FULL DOC -->
|
|
11
11
|
|
|
12
12
|
# CiteContent 引用内容
|
|
13
|
+
## 源码事实
|
|
13
14
|
|
|
14
|
-
|
|
15
|
+
- **源码位置**:`src/components/chat-content/cite-content/cite-content.vue`
|
|
16
|
+
- **能力域**:内容渲染
|
|
17
|
+
- **能力说明**:渲染输入或消息中的引用片段。
|
|
18
|
+
|
|
19
|
+
> **能力域**:内容渲染
|
|
15
20
|
|
|
16
21
|
展示被引用文本片段的紧凑条带组件。固定高度 28px,左侧引用图标 + 单行截断文本 + 可选关闭图标,背景灰色(`#f5f7fa`)。
|
|
17
22
|
|
|
@@ -135,4 +140,4 @@ const message = {
|
|
|
135
140
|
|
|
136
141
|
## 关联组件
|
|
137
142
|
|
|
138
|
-
- [ChatInput](
|
|
143
|
+
- [ChatInput](/components/input/chat-input) — 引用区常见挂载位置
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- AI SUMMARY -->
|
|
2
2
|
## 快速了解
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
渲染 Markdown 代码块,支持高亮、复制和 header 插槽。 源码位置:src/components/markdown-token/code-content/code-content.vue。
|
|
5
5
|
|
|
6
6
|
### 关联组件
|
|
7
7
|
- **markdown-content** — 解析 Markdown 后生成 fence token 并渲染本组件
|
|
@@ -10,10 +10,15 @@ CodeContent 接收 markdown-it 的 fence/code_block token,按行 highlight.js
|
|
|
10
10
|
<!-- FULL DOC -->
|
|
11
11
|
|
|
12
12
|
# CodeContent 代码块渲染
|
|
13
|
+
## 源码事实
|
|
13
14
|
|
|
14
|
-
|
|
15
|
+
- **源码位置**:`src/components/markdown-token/code-content/code-content.vue`
|
|
16
|
+
- **能力域**:内容渲染
|
|
17
|
+
- **能力说明**:渲染 Markdown 代码块,支持高亮、复制和 header 插槽。
|
|
15
18
|
|
|
16
|
-
|
|
19
|
+
> **能力域**:内容渲染
|
|
20
|
+
|
|
21
|
+
代码块渲染基础组件,专为 **Markdown 流式输出**设计。接收 `markdown-it` token 数组,基于 `highlight.js`(github-dark 主题)实现逐行语法高亮,顶部固定深色头部展示语言名和复制按钮。
|
|
17
22
|
|
|
18
23
|
## 组件结构
|
|
19
24
|
|
|
@@ -204,4 +209,4 @@ import type { Token } from 'markdown-it';
|
|
|
204
209
|
|
|
205
210
|
## 关联组件
|
|
206
211
|
|
|
207
|
-
- [MarkdownContent](
|
|
212
|
+
- [MarkdownContent](/components/rendering/markdown-content) — 解析并传入 code fence token
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- AI SUMMARY -->
|
|
2
2
|
## 快速了解
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
展示统一错误提示内容。 源码位置:src/components/chat-content/common-error-content/common-error-content.vue。
|
|
5
5
|
|
|
6
6
|
### 关联组件
|
|
7
7
|
- **markdown-content** — Markdown 渲染错误态展示
|
|
@@ -11,10 +11,15 @@ CommonErrorContent 以红色错误图标加文案展示失败态,布局为 fle
|
|
|
11
11
|
<!-- FULL DOC -->
|
|
12
12
|
|
|
13
13
|
# CommonErrorContent 通用错误内容
|
|
14
|
+
## 源码事实
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
- **源码位置**:`src/components/chat-content/common-error-content/common-error-content.vue`
|
|
17
|
+
- **能力域**:内容渲染
|
|
18
|
+
- **能力说明**:展示统一错误提示内容。
|
|
16
19
|
|
|
17
|
-
|
|
20
|
+
> **能力域**:内容渲染
|
|
21
|
+
|
|
22
|
+
错误状态消息渲染基础组件。红色 `ErrorIcon`(14×14px,绝对定位)+ 文本区域,`display: flex` 水平排列。
|
|
18
23
|
|
|
19
24
|
通常由上层组件在 `status === 'error'` 时自动渲染,无需手动使用。
|
|
20
25
|
|
|
@@ -66,5 +71,5 @@ CommonErrorContent 以红色错误图标加文案展示失败态,布局为 fle
|
|
|
66
71
|
|
|
67
72
|
## 关联组件
|
|
68
73
|
|
|
69
|
-
- [MarkdownContent](
|
|
70
|
-
- [ReasoningMessage](
|
|
74
|
+
- [MarkdownContent](/components/rendering/markdown-content) — Markdown 错误态
|
|
75
|
+
- [ReasoningMessage](/components/message/reasoning-message) — 推理错误态
|
|
@@ -36,6 +36,7 @@ enum MessageRole {
|
|
|
36
36
|
HiddenSystem = 'hidden-system',
|
|
37
37
|
HiddenUser = 'hidden-user',
|
|
38
38
|
Info = 'info',
|
|
39
|
+
Interrupt = 'interrupt',
|
|
39
40
|
Loading = 'loading',
|
|
40
41
|
Pause = 'pause',
|
|
41
42
|
Placeholder = 'placeholder',
|
|
@@ -72,6 +73,70 @@ enum MessageStatus {
|
|
|
72
73
|
| --------------- | ---- |
|
|
73
74
|
| `Fetching` | 请求中:与 `useMessageGroup` 在末尾用户消息后注入的 Loading 占位(`LOADING_MESSAGE_ID`)配合时,`ChatContainer` 会将传入输入区与列表底部的状态推导为该值,便于展示「停止」与禁止重复发送。 |
|
|
74
75
|
|
|
76
|
+
### InterruptReason
|
|
77
|
+
|
|
78
|
+
human-in-the-loop 中断原因枚举,用于 `Interrupt.reason` 区分中断类型并选择对应的 UI 渲染器。
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
enum InterruptReason {
|
|
82
|
+
AIDevToolApproval = 'aidev:tool_approval',
|
|
83
|
+
UserQuestion = 'aidev:user_question',
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### APPROVAL_STATUS
|
|
88
|
+
|
|
89
|
+
AI Dev 工具审批单状态枚举,`AIDevToolApprovalInterrupt.metadata.ticket.status` 使用该类型。
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
enum APPROVAL_STATUS {
|
|
93
|
+
ABANDONED = 'abandoned',
|
|
94
|
+
APPROVED = 'approved',
|
|
95
|
+
CANCELLED = 'cancelled',
|
|
96
|
+
DRAFT = 'draft',
|
|
97
|
+
EXPIRED = 'expired',
|
|
98
|
+
PENDING = 'pending',
|
|
99
|
+
REJECTED = 'rejected',
|
|
100
|
+
REVOKED = 'revoked',
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### APPROVAL_STATUS_MAP
|
|
105
|
+
|
|
106
|
+
审批单状态到展示文案的映射,供 `ToolApprovalCard` 等组件使用:
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
const APPROVAL_STATUS_MAP: Record<APPROVAL_STATUS, string> = {
|
|
110
|
+
[APPROVAL_STATUS.ABANDONED]: '已废弃',
|
|
111
|
+
[APPROVAL_STATUS.APPROVED]: '已通过',
|
|
112
|
+
[APPROVAL_STATUS.CANCELLED]: '已取消',
|
|
113
|
+
[APPROVAL_STATUS.DRAFT]: '待审批',
|
|
114
|
+
[APPROVAL_STATUS.EXPIRED]: '已过期',
|
|
115
|
+
[APPROVAL_STATUS.PENDING]: '待审批',
|
|
116
|
+
[APPROVAL_STATUS.REJECTED]: '已拒绝',
|
|
117
|
+
[APPROVAL_STATUS.REVOKED]: '已撤销',
|
|
118
|
+
};
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
| 状态值 | 展示文案 |
|
|
122
|
+
| ----------- | -------- |
|
|
123
|
+
| `pending` | 待审批 |
|
|
124
|
+
| `draft` | 待审批 |
|
|
125
|
+
| `approved` | 已通过 |
|
|
126
|
+
| `rejected` | 已拒绝 |
|
|
127
|
+
| `cancelled` | 已取消 |
|
|
128
|
+
| `expired` | 已过期 |
|
|
129
|
+
| `abandoned` | 已废弃 |
|
|
130
|
+
| `revoked` | 已撤销 |
|
|
131
|
+
|
|
132
|
+
### RunFinishedOutcome
|
|
133
|
+
|
|
134
|
+
AG-UI `RUN_FINISHED` 事件的结束结果类型。中断结果不再是字符串枚举,而是对象联合类型;`type: 'interrupt'` 时,中断列表放在 `interrupts` 字段中。
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
type RunFinishedOutcome = { interrupts: Interrupt[]; type: 'interrupt' } | { type: 'success' };
|
|
138
|
+
```
|
|
139
|
+
|
|
75
140
|
### MessageContentType
|
|
76
141
|
|
|
77
142
|
消息内容类型枚举:
|
|
@@ -238,6 +303,6 @@ console.log(
|
|
|
238
303
|
|
|
239
304
|
## 关联组件
|
|
240
305
|
|
|
241
|
-
- [MessageTools](../components/
|
|
242
|
-
- [ChatInput](../components/
|
|
243
|
-
- [MessageContainer](../components/
|
|
306
|
+
- [MessageTools](../components/feedback/message-tools) — 消息工具栏
|
|
307
|
+
- [ChatInput](../components/input/chat-input) — 输入与状态
|
|
308
|
+
- [MessageContainer](../components/setup/message-container) — 工具与消息展示
|