@fe-free/ai 4.1.11 → 4.1.13
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 +18 -0
- package/package.json +8 -5
- package/src/ai.stories.tsx +37 -41
- package/src/chat/index.tsx +6 -0
- package/src/helper.tsx +1 -1
- package/src/index.ts +4 -2
- package/src/m_sender/index.tsx +3 -0
- package/src/markdown/chart.tsx +318 -0
- package/src/markdown/code.tsx +29 -0
- package/src/markdown/custom_markdown.stories.tsx +440 -0
- package/src/markdown/hm_chart.tsx +176 -0
- package/src/markdown/index.tsx +100 -0
- package/src/markdown/knowledge_ref.tsx +54 -0
- package/src/markdown/markdown.stories.tsx +184 -0
- package/src/markdown/style.scss +38 -0
- package/src/markdown/think.tsx +55 -0
- package/src/messages/index.tsx +2 -0
- package/src/messages/message_think.tsx +45 -0
- package/src/messages/messages.stories.tsx +45 -0
- package/src/sender/index.tsx +3 -0
- package/src/store/index.ts +9 -1
- package/src/style.scss +13 -2
- package/src/svgs/think.svg +3 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
function KnowledgeRefBlock(props: any) {
|
|
4
|
+
const { knowledgeRefs, onKnowledgeRef } = props;
|
|
5
|
+
const id = props['data-id'];
|
|
6
|
+
|
|
7
|
+
const handleClick = useCallback(() => {
|
|
8
|
+
onKnowledgeRef?.(id);
|
|
9
|
+
}, [id, onKnowledgeRef]);
|
|
10
|
+
|
|
11
|
+
if (id) {
|
|
12
|
+
const index = knowledgeRefs?.findIndex((ref: { id: string }) => ref.id === id);
|
|
13
|
+
|
|
14
|
+
// 没有数据的时候显示 id
|
|
15
|
+
if (index === -1 || index === undefined) {
|
|
16
|
+
return <span>[^knowledge:{id}]</span>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<span
|
|
21
|
+
data-id={id}
|
|
22
|
+
onClick={handleClick}
|
|
23
|
+
className="fea-markdown-body-block-knowledge-ref mx-1 h-[16px] min-w-[16px] cursor-pointer rounded-full border border-blue-500 text-center text-[12px] text-blue-600"
|
|
24
|
+
>
|
|
25
|
+
{index + 1}
|
|
26
|
+
</span>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<span className="fea-markdown-body-block-knowledge-ref-source" onClick={handleClick}>
|
|
32
|
+
来源>>
|
|
33
|
+
</span>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function processWithKnowledgeRef(text: string, knowledgeRefs?: { id: string }[]) {
|
|
38
|
+
// 匹配 [^knowledge:X-Y] 格式
|
|
39
|
+
const knowledgeRefRegex = /\[\^knowledge:(\d+-\d+)\]/g;
|
|
40
|
+
|
|
41
|
+
let count = 0;
|
|
42
|
+
let newText = text.replace(knowledgeRefRegex, (_match, id) => {
|
|
43
|
+
count++;
|
|
44
|
+
return `<knowledge-ref data-id="${id}">${id}</knowledge-ref>`;
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
if (count > 0 && knowledgeRefs && knowledgeRefs.length > 0) {
|
|
48
|
+
newText = `${newText}\n\n<knowledge-ref>来源>></knowledge>`;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return newText;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export { KnowledgeRefBlock, processWithKnowledgeRef };
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { Markdown } from '@fe-free/ai';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof Markdown> = {
|
|
6
|
+
title: '@fe-free/ai/Markdown',
|
|
7
|
+
component: Markdown,
|
|
8
|
+
tags: ['autodocs'],
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default meta;
|
|
12
|
+
|
|
13
|
+
function StreamingComponent(args) {
|
|
14
|
+
const [index, setIndex] = useState(0);
|
|
15
|
+
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
setInterval(() => {
|
|
18
|
+
setIndex((value) => value + 1);
|
|
19
|
+
}, 50);
|
|
20
|
+
}, []);
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<Markdown
|
|
24
|
+
{...args}
|
|
25
|
+
content={args.content.slice(0, index)}
|
|
26
|
+
isStreaming={index !== args.content.length}
|
|
27
|
+
/>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type Story = StoryObj<typeof Markdown>;
|
|
32
|
+
|
|
33
|
+
export const Default: Story = {
|
|
34
|
+
args: {
|
|
35
|
+
content: `
|
|
36
|
+
# Markdown 组件示例
|
|
37
|
+
|
|
38
|
+
这是一个 **Markdown** 组件的基本用法示例。
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 支持的特性
|
|
43
|
+
|
|
44
|
+
- 标题
|
|
45
|
+
- 列表
|
|
46
|
+
- 代码高亮
|
|
47
|
+
- 表格
|
|
48
|
+
- 链接与图片
|
|
49
|
+
- 引用
|
|
50
|
+
- 内联代码
|
|
51
|
+
- 分割线
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 代码高亮
|
|
56
|
+
|
|
57
|
+
\`\`\`typescript
|
|
58
|
+
function hello(name: string): string {
|
|
59
|
+
return \`Hello, \${name}!\`;
|
|
60
|
+
}
|
|
61
|
+
\`\`\`
|
|
62
|
+
|
|
63
|
+
\`\`\`js
|
|
64
|
+
// long line long line long line long line long line long line long line long line long line long line long line long line long line
|
|
65
|
+
function hello(name: string): string {
|
|
66
|
+
return \`Hello, \${name}!\`;
|
|
67
|
+
}
|
|
68
|
+
\`\`\`
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 表格
|
|
73
|
+
|
|
74
|
+
| 姓名 | 年龄 | 城市 | 职业 | 邮箱 | 状态 |状态 |状态 |状态 |
|
|
75
|
+
| ------ | ---- | ------ | ---------- | --------------------- | ------ |------ |------ |------ |
|
|
76
|
+
| 张三 | 28 | 北京 | 前端开发 | zhangsan@example.com | 在职 |
|
|
77
|
+
| 李四 | 32 | 上海 | 产品经理 | lisi@example.com | 离职 |
|
|
78
|
+
| 王五 | 24 | 广州 | 设计师 | wangwu@example.com | 在职 |
|
|
79
|
+
| 赵六 | 29 | 深圳 | 测试工程师 | zhaoliu@example.com | 实习 |
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 链接与图片
|
|
84
|
+
|
|
85
|
+
[访问 Ant Design 官网](https://ant.design)
|
|
86
|
+
|
|
87
|
+

|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 引用
|
|
92
|
+
|
|
93
|
+
> 这是一段引用文本,可以用于强调内容。
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 内联代码
|
|
98
|
+
|
|
99
|
+
你可以在文本中嵌入 \`const a = 1;\` 这样的内联代码。
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 分割线
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
`,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export const Streaming: Story = {
|
|
111
|
+
render: StreamingComponent,
|
|
112
|
+
args: {
|
|
113
|
+
content: `
|
|
114
|
+
# Markdown 组件示例
|
|
115
|
+
|
|
116
|
+
这是一个 **Markdown** 组件的基本用法示例。
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 支持的特性
|
|
121
|
+
|
|
122
|
+
- 标题
|
|
123
|
+
- 列表
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 代码高亮
|
|
128
|
+
|
|
129
|
+
\`\`\`typescript
|
|
130
|
+
function hello(name: string): string {
|
|
131
|
+
return \`Hello, \${name}!\`;
|
|
132
|
+
}
|
|
133
|
+
\`\`\`
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
## 表格
|
|
137
|
+
|
|
138
|
+
| 姓名 | 年龄 | 城市 | 职业 | 邮箱 | 状态 |状态 |状态 |状态 |
|
|
139
|
+
| ------ | ---- | ------ | ---------- | --------------------- | ------ |------ |------ |------ |
|
|
140
|
+
| 张三 | 28 | 北京 | 前端开发 | zhangsan@example.com | 在职 |
|
|
141
|
+
| 李四 | 32 | 上海 | 产品经理 | lisi@example.com | 离职 |
|
|
142
|
+
| 王五 | 24 | 广州 | 设计师 | wangwu@example.com | 在职 |
|
|
143
|
+
| 赵六 | 29 | 深圳 | 测试工程师 | zhaoliu@example.com | 实习 |
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
`,
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
export const Latex: Story = {
|
|
151
|
+
args: {
|
|
152
|
+
content: `
|
|
153
|
+
### Latex
|
|
154
|
+
inline standard: $\\frac{df}{dt}$ \n
|
|
155
|
+
block standard:\n
|
|
156
|
+
$$
|
|
157
|
+
\\Delta t' = \\frac{\\Delta t}{\\sqrt{1 - \\frac{v^2}{c^2}}}
|
|
158
|
+
$$
|
|
159
|
+
|
|
160
|
+
inline: \\(\\frac{df}{dt}\\) \n
|
|
161
|
+
block: \n
|
|
162
|
+
\\[
|
|
163
|
+
\\Delta t' = \\frac{\\Delta t}{\\sqrt{1 - \\frac{v^2}{c^2}}}
|
|
164
|
+
\\]
|
|
165
|
+
|
|
166
|
+
`,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
export const Think: Story = {
|
|
171
|
+
render: StreamingComponent,
|
|
172
|
+
args: {
|
|
173
|
+
content: `
|
|
174
|
+
<think>Deep thinking is a systematic and structured cognitive approach that requires individuals to move beyond intuition and superficial information, delving into the essence of a problem and its underlying principles through logical analysis, multi-perspective examination, and persistent inquiry. Unlike quick reactions or heuristic judgments, deep thinking emphasizes slow thinking, actively engaging knowledge reserves, critical thinking, and creativity to uncover deeper connections and meanings.
|
|
175
|
+
Key characteristics of deep thinking include:
|
|
176
|
+
Probing the Essence: Not settling for "what it is," but continuously asking "why" and "how it works" until reaching the fundamental logic.
|
|
177
|
+
Multidimensional Connections: Placing the issue in a broader context and analyzing it through interdisciplinary knowledge or diverse perspectives.
|
|
178
|
+
Skepticism & Reflection: Challenging existing conclusions, authoritative opinions, and even personal biases, validating them through logic or evidence.
|
|
179
|
+
Long-term Value Focus: Prioritizing systemic consequences and sustainable impact over short-term or localized benefits.
|
|
180
|
+
This mode of thinking helps individuals avoid cognitive biases in complex scenarios, improve decision-making, and generate groundbreaking insights in fields such as academic research, business innovation, and social problem-solving.</think>
|
|
181
|
+
# Hello Deep Thinking\n Deep thinking is over.\n\n You can use the think tag to package your thoughts.
|
|
182
|
+
`,
|
|
183
|
+
},
|
|
184
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
.fea-markdown {
|
|
2
|
+
&.x-markdown-light pre code:not([class$='-highlightCode-code'] pre code) {
|
|
3
|
+
padding: 0 !important;
|
|
4
|
+
background-color: transparent !important;
|
|
5
|
+
margin: 0 !important;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.fea-markdown-body-block-chart {
|
|
9
|
+
background: white;
|
|
10
|
+
border-radius: 6px;
|
|
11
|
+
margin: 0.5rem;
|
|
12
|
+
|
|
13
|
+
.fea-markdown-body-block-chart-title {
|
|
14
|
+
font-size: 16px;
|
|
15
|
+
font-weight: bold;
|
|
16
|
+
padding: 10px;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.fea-markdown-body-block-knowledge-ref[data-id] {
|
|
21
|
+
height: 16px;
|
|
22
|
+
min-width: 16px;
|
|
23
|
+
cursor: pointer;
|
|
24
|
+
display: inline-flex;
|
|
25
|
+
align-items: center;
|
|
26
|
+
justify-content: center;
|
|
27
|
+
border-radius: 999px;
|
|
28
|
+
border: 1px solid #0374e9;
|
|
29
|
+
color: #0374e9;
|
|
30
|
+
font-size: 12px;
|
|
31
|
+
padding: 0 4px;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.fea-markdown-body-block-knowledge-ref-source {
|
|
35
|
+
color: #0374e9;
|
|
36
|
+
cursor: pointer;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { ComponentProps } from '@ant-design/x-markdown';
|
|
2
|
+
import { memo, useEffect, useState } from 'react';
|
|
3
|
+
import { MessageThinkOfDeepSeek } from '../messages';
|
|
4
|
+
|
|
5
|
+
const ThinkComponent = memo((props: ComponentProps) => {
|
|
6
|
+
const [title, setTitle] = useState('思考中...');
|
|
7
|
+
const [loading, setLoading] = useState(true);
|
|
8
|
+
const [expand, setExpand] = useState(true);
|
|
9
|
+
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (props.streamStatus === 'done') {
|
|
12
|
+
setTitle('完成思考');
|
|
13
|
+
setLoading(false);
|
|
14
|
+
setExpand(false);
|
|
15
|
+
}
|
|
16
|
+
}, [props.streamStatus]);
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<MessageThinkOfDeepSeek
|
|
20
|
+
title={title}
|
|
21
|
+
loading={loading}
|
|
22
|
+
expanded={expand}
|
|
23
|
+
onClick={() => setExpand(!expand)}
|
|
24
|
+
>
|
|
25
|
+
{props.children}
|
|
26
|
+
</MessageThinkOfDeepSeek>
|
|
27
|
+
);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
function compatibleWithDeepSeek(text: string) {
|
|
31
|
+
if (!text.startsWith('<think>')) {
|
|
32
|
+
return text;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const [left, right] = text.split('</think>');
|
|
36
|
+
|
|
37
|
+
let newText = text;
|
|
38
|
+
|
|
39
|
+
// 如果 think 部分是 <think>\n\n</think>,相当于没有,则直接返回 right
|
|
40
|
+
if (text.startsWith('<think>\n\n</think>')) {
|
|
41
|
+
newText = right;
|
|
42
|
+
}
|
|
43
|
+
// 否则做一些处理
|
|
44
|
+
else {
|
|
45
|
+
newText =
|
|
46
|
+
left
|
|
47
|
+
.replace('<think>\n', '<think>')
|
|
48
|
+
.replace('\n</think>', '</think>')
|
|
49
|
+
.replace(/\n/g, '<br/>') + (right || '');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return newText;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { compatibleWithDeepSeek, ThinkComponent };
|
package/src/messages/index.tsx
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { MessageActions } from './message_actions';
|
|
2
|
+
export { MessageThink, MessageThinkOfDeepSeek } from './message_think';
|
|
3
|
+
export type { MessageThinkProps } from './message_think';
|
|
2
4
|
export { Messages } from './messages';
|
|
3
5
|
export type { MessagesProps } from './messages';
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Think } from '@ant-design/x';
|
|
2
|
+
import Icons from '@fe-free/icons';
|
|
3
|
+
import classNames from 'classnames';
|
|
4
|
+
import ThinkIcon from '../svgs/think.svg?react';
|
|
5
|
+
|
|
6
|
+
interface MessageThinkProps {
|
|
7
|
+
title: string;
|
|
8
|
+
icon?: React.ReactNode;
|
|
9
|
+
loading?: boolean;
|
|
10
|
+
children?: React.ReactNode;
|
|
11
|
+
expanded?: boolean;
|
|
12
|
+
onClick?: () => void;
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function MessageThink({
|
|
17
|
+
title,
|
|
18
|
+
icon,
|
|
19
|
+
loading,
|
|
20
|
+
children,
|
|
21
|
+
expanded,
|
|
22
|
+
onClick,
|
|
23
|
+
className,
|
|
24
|
+
}: MessageThinkProps) {
|
|
25
|
+
return (
|
|
26
|
+
<Think
|
|
27
|
+
title={title}
|
|
28
|
+
icon={icon || <Icons component={ThinkIcon} className="!text-sm" />}
|
|
29
|
+
loading={loading}
|
|
30
|
+
blink={loading}
|
|
31
|
+
expanded={expanded}
|
|
32
|
+
onClick={onClick}
|
|
33
|
+
className={classNames('fea-message-think', className)}
|
|
34
|
+
>
|
|
35
|
+
{children}
|
|
36
|
+
</Think>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function MessageThinkOfDeepSeek(props: MessageThinkProps) {
|
|
41
|
+
return <MessageThink {...props} className="fea-message-think-deep-seek" />;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export { MessageThink, MessageThinkOfDeepSeek };
|
|
45
|
+
export type { MessageThinkProps };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { MessageThink } from '@fe-free/ai';
|
|
2
|
+
import { CheckCircleOutlined } from '@fe-free/icons';
|
|
3
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof MessageThink> = {
|
|
6
|
+
title: '@fe-free/ai/MessageThink',
|
|
7
|
+
component: MessageThink,
|
|
8
|
+
tags: ['autodocs'],
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
type Story = StoryObj<typeof MessageThink>;
|
|
12
|
+
|
|
13
|
+
export const Default: Story = {
|
|
14
|
+
args: {
|
|
15
|
+
title: '思考',
|
|
16
|
+
children: '这是 Think 的内容',
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const Loading: Story = {
|
|
21
|
+
args: {
|
|
22
|
+
title: '思考中...',
|
|
23
|
+
loading: true,
|
|
24
|
+
children: '这是 Think 的内容',
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const Icon: Story = {
|
|
29
|
+
args: {
|
|
30
|
+
title: '思考',
|
|
31
|
+
children: '这是 Think 的内容',
|
|
32
|
+
icon: <CheckCircleOutlined className="text-green08" />,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export const DeepSeek: Story = {
|
|
37
|
+
args: {
|
|
38
|
+
title: '思考中...',
|
|
39
|
+
loading: true,
|
|
40
|
+
children: '这是 Think 的内容',
|
|
41
|
+
type: 'deepSeek',
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export default meta;
|
package/src/sender/index.tsx
CHANGED
package/src/store/index.ts
CHANGED
|
@@ -6,7 +6,7 @@ interface BaseSenderValue {
|
|
|
6
6
|
text?: string;
|
|
7
7
|
files?: string[];
|
|
8
8
|
}
|
|
9
|
-
interface ChatStore<Value extends BaseSenderValue | undefined, AIData> {
|
|
9
|
+
interface ChatStore<Value extends BaseSenderValue | undefined, AIData, ContextData = any> {
|
|
10
10
|
senderValue?: Value;
|
|
11
11
|
setSenderValue: (senderValue?: Value) => void;
|
|
12
12
|
|
|
@@ -15,6 +15,10 @@ interface ChatStore<Value extends BaseSenderValue | undefined, AIData> {
|
|
|
15
15
|
addMessage: (message: ChatMessage<AIData>) => void;
|
|
16
16
|
updateMessage: (message: ChatMessage<AIData>) => void;
|
|
17
17
|
|
|
18
|
+
/** 存放Chat的上下文数据 */
|
|
19
|
+
contextData?: ContextData;
|
|
20
|
+
setContextData: (contextData?: ContextData) => void;
|
|
21
|
+
|
|
18
22
|
reset: () => void;
|
|
19
23
|
}
|
|
20
24
|
|
|
@@ -62,6 +66,10 @@ function createChatStore<Value extends BaseSenderValue | undefined, AIData>() {
|
|
|
62
66
|
}),
|
|
63
67
|
}));
|
|
64
68
|
},
|
|
69
|
+
contextData: undefined,
|
|
70
|
+
setContextData: (contextData) => {
|
|
71
|
+
set(() => ({ contextData }));
|
|
72
|
+
},
|
|
65
73
|
reset: () => {
|
|
66
74
|
set(store.getInitialState());
|
|
67
75
|
},
|
package/src/style.scss
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
@keyframes sender-rectangle-white {
|
|
1
|
+
@keyframes fea-sender-rectangle-white {
|
|
2
2
|
0%,
|
|
3
3
|
80%,
|
|
4
4
|
100% {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
@keyframes sender-rectangle-primary {
|
|
15
|
+
@keyframes fea-sender-rectangle-primary {
|
|
16
16
|
0%,
|
|
17
17
|
80%,
|
|
18
18
|
100% {
|
|
@@ -25,3 +25,14 @@
|
|
|
25
25
|
box-shadow: 0 -8px theme('colors.primary');
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
+
|
|
29
|
+
.fea-message-think {
|
|
30
|
+
&:not(.fea-message-think-deep-seek) {
|
|
31
|
+
.ant-think-content {
|
|
32
|
+
border-inline-start: none;
|
|
33
|
+
background-color: theme('backgroundColor.01');
|
|
34
|
+
padding: 12px 16px;
|
|
35
|
+
border-radius: 8px;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M9.80022 0.000346623C10.3956 -0.0083669 10.97 0.146298 11.3912 0.566726C11.8123 0.987879 11.9677 1.56297 11.9583 2.1584C11.9496 2.75164 11.7782 3.41387 11.4935 4.09352C11.2145 4.7429 10.8741 5.36414 10.477 5.94878C10.9214 6.60592 11.2793 7.25436 11.5349 7.86575C11.8196 8.54541 11.9902 9.20764 11.9997 9.80088C12.0084 10.3963 11.853 10.9707 11.4326 11.3911C11.0114 11.8123 10.4363 11.9684 9.84088 11.9589C9.24763 11.9502 8.58613 11.7789 7.90575 11.4942C7.29726 11.2401 6.65318 10.8843 5.99894 10.4428C5.34543 10.8843 4.70135 11.2401 4.09286 11.4942C3.4132 11.7789 2.75097 11.9502 2.15773 11.9589C1.5623 11.9684 0.987938 11.8123 0.566784 11.3918C0.14563 10.9707 -0.00903481 10.3963 0.000404838 9.80088C0.00911836 9.20691 0.179032 8.54541 0.463674 7.86575C0.719271 7.25436 1.0758 6.60592 1.52019 5.94878C1.12348 5.36412 0.783555 4.74287 0.505063 4.09352C0.220421 3.41387 0.0505076 2.75164 0.041068 2.1584C0.0323545 1.56297 0.186293 0.988605 0.607447 0.567452C1.0286 0.146298 1.60369 -0.00836689 2.19912 0.00107276C2.79236 0.00978629 3.45387 0.1797 4.13425 0.464342C4.72967 0.713403 5.35922 1.05831 5.99894 1.486C6.63866 1.05759 7.26966 0.713403 7.86509 0.464342C8.54474 0.1797 9.20624 0.00978628 9.80022 0.000346623ZM2.20638 6.89057C1.9225 7.33469 1.67575 7.80148 1.46863 8.28618C1.21667 8.88887 1.09468 9.40805 1.08814 9.81686C1.08233 10.2235 1.18835 10.4733 1.33648 10.6214C1.48533 10.7695 1.73585 10.8756 2.14175 10.8697C2.55056 10.8639 3.06974 10.7419 3.67243 10.49C4.15456 10.2835 4.61891 10.0377 5.06078 9.75514C4.53958 9.34105 4.04257 8.89738 3.57222 8.42632C3.0712 7.9253 2.61374 7.40829 2.20638 6.89057ZM9.7915 6.89057C8.95508 7.9533 7.99736 8.91467 6.93782 9.75514C7.4207 10.0601 7.88905 10.307 8.32618 10.49C8.92886 10.7419 9.44877 10.8639 9.85758 10.8697C10.2642 10.8763 10.514 10.7703 10.6621 10.6214C10.8103 10.4733 10.9163 10.2235 10.9105 9.81686C10.9039 9.40805 10.7819 8.88814 10.53 8.28618C10.3226 7.80147 10.0756 7.33468 9.7915 6.89057ZM5.99894 2.82208C5.39911 3.27502 4.83182 3.76951 4.30126 4.30192C3.78316 4.81841 3.30086 5.36961 2.85772 5.95168C3.31201 6.55419 3.80822 7.12392 4.34264 7.65663C4.86105 8.1765 5.41444 8.66026 5.99894 9.10453C6.5508 8.687 7.10992 8.20268 7.65596 7.65663C8.18989 7.12387 8.68561 6.55414 9.13944 5.95168C8.69678 5.36964 8.21497 4.81845 7.69735 4.30192C7.13824 3.74281 6.56459 3.24686 5.99894 2.82208ZM2.18242 1.08881C1.77579 1.083 1.526 1.18902 1.37787 1.33715C1.22974 1.486 1.12372 1.73579 1.12953 2.14242C1.13607 2.55123 1.25806 3.07041 1.51002 3.6731C1.68647 4.09498 1.92174 4.54445 2.21074 5.00917C2.62264 4.4922 3.06362 3.99909 3.53156 3.53223C4.01281 3.05013 4.52198 2.59673 5.05643 2.17437C4.5888 1.88319 4.13715 1.64648 3.71309 1.4693C3.11041 1.21734 2.59123 1.09535 2.18242 1.08881ZM9.81619 1.08881C9.40738 1.09607 8.88748 1.21734 8.28552 1.4693C7.86146 1.64648 7.40908 1.88319 6.94218 2.17365C7.47661 2.59602 7.98578 3.04942 8.46705 3.5315C8.93477 3.99886 9.37552 4.49245 9.78715 5.0099C10.0761 4.54518 10.3136 4.0957 10.49 3.67382C10.742 3.07114 10.864 2.55196 10.8698 2.14315C10.8763 1.73652 10.7703 1.48673 10.6215 1.33787C10.4733 1.18974 10.2235 1.08373 9.81692 1.08954L9.81619 1.08881Z"/>
|
|
3
|
+
</svg>
|