@deep-eye/core 0.9.0 → 0.9.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/CHANGELOG.md +14 -0
- package/README.md +137 -22
- package/dist/components/chat/ChatBot.vue.d.ts.map +1 -1
- package/dist/components/chat/components/ArtifactPreview.vue.d.ts +15 -0
- package/dist/components/chat/components/ArtifactPreview.vue.d.ts.map +1 -0
- package/dist/index.cjs +112 -27
- package/dist/index.js +5532 -5041
- package/dist/style.css +1 -1
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
此文件记录 `@deep-eye/core` 的用户可见变更。新版本采用语义化版本,并按 `Added`、`Changed`、`Fixed`、`Removed` 分类记录。
|
|
4
4
|
|
|
5
|
+
## [0.9.1] - 2026-07-28
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- `ChatBot` 默认工件侧边栏新增 Preview/Code、复制、下载、展开/收起和关闭操作栏。
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- 工件侧边栏在桌面端与移动端使用更稳定的响应式布局,自定义 `sidebar` 插槽仍可完整替换默认预览。
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- 工件预览关闭操作恢复为明确的关闭图标与“关闭侧边栏”可访问语义。
|
|
18
|
+
|
|
5
19
|
## [0.7.0] - 2026-07-23
|
|
6
20
|
|
|
7
21
|
### Added
|
package/README.md
CHANGED
|
@@ -8,18 +8,78 @@
|
|
|
8
8
|
pnpm add @deep-eye/core
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
引入样式:
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import '@deep-eye/core/style.css'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 快速开始
|
|
18
|
+
|
|
19
|
+
`ChatBot` 提供开箱即用的聊天界面,包含消息列表、输入框和可选侧边栏:
|
|
20
|
+
|
|
21
|
+
```vue
|
|
22
|
+
<script setup lang="ts">
|
|
23
|
+
import { ref } from 'vue'
|
|
24
|
+
import { ChatBot } from '@deep-eye/core'
|
|
25
|
+
import type { ConversationMessage } from '@deep-eye/core'
|
|
26
|
+
import '@deep-eye/core/style.css'
|
|
27
|
+
|
|
28
|
+
const messages = ref<ConversationMessage[]>([
|
|
29
|
+
{ id: '1', role: 'assistant', content: '你好!有什么可以帮助你的吗?' },
|
|
30
|
+
])
|
|
31
|
+
|
|
32
|
+
function handleSend(content: string, files?: File[]) {
|
|
33
|
+
messages.value.push({
|
|
34
|
+
id: Date.now().toString(),
|
|
35
|
+
role: 'user',
|
|
36
|
+
content,
|
|
37
|
+
})
|
|
38
|
+
// 调用 API 获取回复...
|
|
39
|
+
}
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<template>
|
|
43
|
+
<ChatBot :messages="messages" @send="handleSend" />
|
|
44
|
+
</template>
|
|
45
|
+
```
|
|
46
|
+
|
|
11
47
|
## 组件
|
|
12
48
|
|
|
49
|
+
### ChatBot
|
|
50
|
+
|
|
51
|
+
完整的聊天机器人界面,采用类似 Claude 的布局,内置 `AiConversation` 与 `ChatSender`,支持工件预览侧边栏。
|
|
52
|
+
|
|
53
|
+
```vue
|
|
54
|
+
<script setup lang="ts">
|
|
55
|
+
import { ChatBot } from '@deep-eye/core'
|
|
56
|
+
import type { ConversationUiAction } from '@deep-eye/core'
|
|
57
|
+
|
|
58
|
+
function handleAction(action: ConversationUiAction) {
|
|
59
|
+
if (action.type === 'open-artifact') {
|
|
60
|
+
// 点击工件卡片时自动打开侧边栏预览
|
|
61
|
+
console.log('打开工件:', action.title)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
</script>
|
|
65
|
+
|
|
66
|
+
<template>
|
|
67
|
+
<ChatBot :messages="messages" :show-sidebar="true" @send="handleSend" @action="handleAction" />
|
|
68
|
+
</template>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
支持 `#sidebar`、`#empty`、`#sender-prepend`、`#assistant-actionbar` 等插槽,以及 `senderConfig`、`conversationConfig` 透传子组件配置。
|
|
72
|
+
|
|
13
73
|
### AI Conversation
|
|
14
74
|
|
|
15
|
-
完整的 AI
|
|
75
|
+
完整的 AI 会话渲染方案,支持流式输出、Markdown / 公式 / 多媒体、用户交互表单等。
|
|
16
76
|
|
|
17
77
|
#### AiConversation
|
|
18
78
|
|
|
19
79
|
渲染完整的会话列表,内置自动滚动、流式动画和操作栏。
|
|
20
80
|
|
|
21
81
|
```vue
|
|
22
|
-
<script setup lang
|
|
82
|
+
<script setup lang="ts">
|
|
23
83
|
import { ref } from 'vue'
|
|
24
84
|
import {
|
|
25
85
|
AiConversation,
|
|
@@ -43,9 +103,9 @@ function onCopy(payload: ChatActionbarCopyPayload): void {
|
|
|
43
103
|
</script>
|
|
44
104
|
|
|
45
105
|
<template>
|
|
46
|
-
<AiConversation :messages
|
|
47
|
-
<template #assistant-actionbar
|
|
48
|
-
<button type
|
|
106
|
+
<AiConversation :messages="messages" auto-scroll="smart" @copy="onCopy">
|
|
107
|
+
<template #assistant-actionbar="{ message }">
|
|
108
|
+
<button type="button" @click="saveReply(message)">保存</button>
|
|
49
109
|
</template>
|
|
50
110
|
</AiConversation>
|
|
51
111
|
</template>
|
|
@@ -57,16 +117,29 @@ function onCopy(payload: ChatActionbarCopyPayload): void {
|
|
|
57
117
|
|
|
58
118
|
将后端的 OpenAI 兼容 `chat.completion.chunk` SSE 响应交给 `useConversationStream().consume(response)`,即可得到可传入 `AiConversation` 的消息列表。渲染会隐藏 `LLM Running`、`🛠️` 和 `<summary>` 运行标记,但不改写原始消息。
|
|
59
119
|
|
|
60
|
-
|
|
120
|
+
```vue
|
|
121
|
+
<script setup lang="ts">
|
|
122
|
+
import { AiConversation, useConversationStream } from '@deep-eye/core'
|
|
123
|
+
|
|
124
|
+
const { messages, status, consume } = useConversationStream()
|
|
125
|
+
|
|
126
|
+
async function fetchReply() {
|
|
127
|
+
const response = await fetch('/api/chat', { method: 'POST' })
|
|
128
|
+
await consume(response)
|
|
129
|
+
}
|
|
130
|
+
</script>
|
|
61
131
|
|
|
62
|
-
|
|
132
|
+
<template>
|
|
133
|
+
<AiConversation :messages="messages" />
|
|
134
|
+
</template>
|
|
135
|
+
```
|
|
63
136
|
|
|
64
137
|
#### ChatSender
|
|
65
138
|
|
|
66
139
|
支持文本输入、文件上传、语音录音和截图的聊天输入框。
|
|
67
140
|
|
|
68
141
|
```vue
|
|
69
|
-
<script setup lang
|
|
142
|
+
<script setup lang="ts">
|
|
70
143
|
import { ref } from 'vue'
|
|
71
144
|
import { ChatSender } from '@deep-eye/core'
|
|
72
145
|
|
|
@@ -80,10 +153,10 @@ function handleSend(content: string, files?: File[]) {
|
|
|
80
153
|
|
|
81
154
|
<template>
|
|
82
155
|
<ChatSender
|
|
83
|
-
v-model
|
|
84
|
-
:show-screenshot
|
|
85
|
-
placeholder
|
|
86
|
-
@send
|
|
156
|
+
v-model="message"
|
|
157
|
+
:show-screenshot="true"
|
|
158
|
+
placeholder="输入消息..."
|
|
159
|
+
@send="handleSend"
|
|
87
160
|
/>
|
|
88
161
|
</template>
|
|
89
162
|
```
|
|
@@ -107,34 +180,76 @@ function handleSend(content: string, files?: File[]) {
|
|
|
107
180
|
|
|
108
181
|
| 组件 | 用途 |
|
|
109
182
|
| ---------------- | --------------------------------------------------------- |
|
|
183
|
+
| `ChatBot` | 完整聊天界面,含消息区、输入框、工件侧边栏 |
|
|
110
184
|
| `AiConversation` | 会话列表、自动滚动、AskUserForm 与 `#assistant-actionbar` |
|
|
111
185
|
| `ChatMessage` | 单条 `ConversationMessage`,支持 `#actionbar` 与 `@copy` |
|
|
112
186
|
| `ChatActionbar` | 默认复制操作,支持默认插槽追加操作与 `@copy` |
|
|
113
187
|
| `ChatSender` | 聊天输入框,支持文本、文件、语音和截图 |
|
|
114
188
|
|
|
189
|
+
### 交互组件
|
|
190
|
+
|
|
191
|
+
消息内容支持 mdoc 标签语法,用于在对话中嵌入工件卡片和动态表单。
|
|
192
|
+
|
|
193
|
+
**工件卡片(Artifact)**
|
|
194
|
+
|
|
195
|
+
助手回复中使用 `{% artifact %}` 标签生成可预览、可下载的卡片。点击卡片可在 `ChatBot` 侧边栏中预览。
|
|
196
|
+
|
|
197
|
+
```markdown
|
|
198
|
+
{% artifact id="demo" title="示例页面" type="html" %}
|
|
199
|
+
|
|
200
|
+
<!DOCTYPE html>
|
|
201
|
+
<html><body><h1>Hello World</h1></body></html>
|
|
202
|
+
{% /artifact %}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
支持的文本类型:`html`、`code`、`markdown`、`text`、`svg`、`mermaid`、`react`、`vue`。文件引用类型:`pdf`、`word`、`excel`、`ppt`、`zip`、`file`(需 `src` 属性)。
|
|
206
|
+
|
|
207
|
+
将 `ARTIFACT_BLOCK_SYSTEM_PROMPT` 拼入 LLM system prompt,引导模型正确输出工件语法。
|
|
208
|
+
|
|
209
|
+
**动态表单(AskUserForm)**
|
|
210
|
+
|
|
211
|
+
使用 `{% ask-form %}` 收集用户选择。单选自动提交,多选点击「确认」,`required=false` 可跳过。
|
|
212
|
+
|
|
213
|
+
将 `ASK_USER_FORM_SYSTEM_PROMPT` 拼入 LLM system prompt。`ChatBot` 会在底部 dock 区域展示表单;`AiConversation` 内联渲染。
|
|
214
|
+
|
|
215
|
+
### Composables
|
|
216
|
+
|
|
217
|
+
| Composable | 用途 |
|
|
218
|
+
| ----------------------- | ------------------------------------------------ |
|
|
219
|
+
| `useConversation` | 管理消息列表,追加 OpenAI chunk 或自定义 delta |
|
|
220
|
+
| `useConversationStream` | 消费 SSE / ReadableStream,内置流式状态与 resume |
|
|
221
|
+
|
|
222
|
+
`useConversation` 仅负责渲染层状态,不包含网络请求、重试或持久化逻辑,可与任意后端 API 组合。
|
|
223
|
+
|
|
115
224
|
### D3MindMap
|
|
116
225
|
|
|
117
226
|
基于 D3.js 的思维导图可视化组件。
|
|
118
227
|
|
|
119
228
|
```vue
|
|
120
|
-
<script setup lang
|
|
229
|
+
<script setup lang="ts">
|
|
121
230
|
import { D3MindMap } from '@deep-eye/core'
|
|
122
|
-
import type {
|
|
123
|
-
|
|
124
|
-
const data:
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
231
|
+
import type { MindMapData } from '@deep-eye/core'
|
|
232
|
+
|
|
233
|
+
const data: MindMapData = {
|
|
234
|
+
nodeData: {
|
|
235
|
+
id: 'root',
|
|
236
|
+
topic: '根节点',
|
|
237
|
+
root: true,
|
|
238
|
+
children: [
|
|
239
|
+
{ id: '1', topic: '子节点 1' },
|
|
240
|
+
{ id: '2', topic: '子节点 2' },
|
|
241
|
+
],
|
|
242
|
+
},
|
|
130
243
|
}
|
|
131
244
|
</script>
|
|
132
245
|
|
|
133
246
|
<template>
|
|
134
|
-
<D3MindMap :data
|
|
247
|
+
<D3MindMap :data="data" height="600px" show-toolbar />
|
|
135
248
|
</template>
|
|
136
249
|
```
|
|
137
250
|
|
|
251
|
+
支持多主题、缩放平移、节点折叠展开,以及 PNG / SVG / JSON 导出。
|
|
252
|
+
|
|
138
253
|
## Changelog
|
|
139
254
|
|
|
140
255
|
每个功能版本的用户可见变化记录在 [CHANGELOG.md](./CHANGELOG.md)。发布前在文件顶部新增版本,并使用 `Added`、`Changed`、`Fixed` 或 `Removed` 分类。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBot.vue.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ChatBot.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChatBot.vue.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ChatBot.vue"],"names":[],"mappings":"AA2UA,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAI9B,UAAU,KAAK;IACb,QAAQ,EAAE,SAAS,mBAAmB,EAAE,GAAG,GAAG,CAAC,SAAS,mBAAmB,EAAE,CAAC,CAAA;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACvC,kBAAkB,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;CAClD;AAUD,KAAK,WAAW,GAAG;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAAA;KAAE,KAAK,OAAO,CAAA;IACvE,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAA;IAChC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAA;IAC/B,KAAK,CAAC,EAAE,MAAM,OAAO,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAA;IAClC,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAA;CAClF,CAAC;AAwSF,QAAA,MAAM,UAAU;;;;;;;;;;;iBA9TA,OAAO;kBACN,MAAM,GAAG,MAAM;kBACf,OAAO,CAAC,eAAe,CAAC;wBAClB,OAAO,CAAC,mBAAmB,CAAC;6EA+TjD,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ConversationUiAction } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
artifact: ConversationUiAction;
|
|
4
|
+
expanded?: boolean;
|
|
5
|
+
};
|
|
6
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
7
|
+
close: () => any;
|
|
8
|
+
"toggle-expanded": () => any;
|
|
9
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
10
|
+
onClose?: (() => any) | undefined;
|
|
11
|
+
"onToggle-expanded"?: (() => any) | undefined;
|
|
12
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
13
|
+
declare const _default: typeof __VLS_export;
|
|
14
|
+
export default _default;
|
|
15
|
+
//# sourceMappingURL=ArtifactPreview.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArtifactPreview.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/ArtifactPreview.vue"],"names":[],"mappings":"AA4TA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAKpD,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,oBAAoB,CAAA;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAC;AA+hBF,QAAA,MAAM,YAAY;;;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
|