feat: 全新智能体功能

- 基于先进智能体框架,增加智能体编排功能
- 增加智能体聊天,并对接持久化
This commit is contained in:
2026-05-25 11:42:48 +08:00
parent 6c3d98eaac
commit 72df00f25b
168 changed files with 22045 additions and 400 deletions

View File

@@ -1,16 +1,17 @@
<script setup lang="ts">
import type {
ChatTimeAssistantSegment,
ChatTimeAssistantTextSegment,
ChatTimeTimelineItem,
} from '@easyflow/types';
import { computed, ref } from 'vue';
import {computed, ref} from 'vue';
import { ChatThinkingBlock, ChatTimeMarkdown } from '@easyflow/common-ui';
import { IconifyIcon } from '@easyflow/icons';
import {ChatThinkingBlock, ChatTimeMarkdown} from '@easyflow/common-ui';
import {IconifyIcon} from '@easyflow/icons';
import { CircleCheck } from '@element-plus/icons-vue';
import { ElIcon } from 'element-plus';
import {CircleCheck} from '@element-plus/icons-vue';
import {ElIcon} from 'element-plus';
import ShowJson from '#/components/json/ShowJson.vue';
@@ -29,7 +30,22 @@ const renderableSegments = computed(() => {
return [] as ChatTimeAssistantSegment[];
}
if (props.item.segments.length > 0) {
return props.item.segments;
const textSegments = props.item.segments.filter(
(segment): segment is ChatTimeAssistantTextSegment =>
segment.type === 'text',
);
if (textSegments.length <= 1) {
return props.item.segments;
}
const mergedTextSegment: ChatTimeAssistantTextSegment = {
content: textSegments.map((segment) => segment.content).join(''),
id: `${props.item.id}-merged-text`,
type: 'text',
};
return [
...props.item.segments.filter((segment) => segment.type !== 'text'),
mergedTextSegment,
];
}
if (!props.item.content) {
return [] as ChatTimeAssistantSegment[];
@@ -74,7 +90,11 @@ function toggleToolExpanded() {
:status="segment.status"
class="chat-thinking-block-item"
/>
<ChatTimeMarkdown v-else :content="segment.content" />
<ChatTimeMarkdown
v-else
:content="segment.content"
:streaming="item.typing"
/>
</template>
</div>
</template>
@@ -124,7 +144,7 @@ function toggleToolExpanded() {
</div>
</template>
<ChatTimeMarkdown v-else :content="item.content" />
<ChatTimeMarkdown v-else :content="item.content" :streaming="item.typing" />
</template>
<style scoped>