Skip to content

Commit b78bbdd

Browse files
committed
feat(chat): add Chat before type
1 parent 918e4e2 commit b78bbdd

10 files changed

Lines changed: 37 additions & 37 deletions

File tree

src/chat-message/content/search-content.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Component, OmiProps, signal, tag } from 'omi';
55

66
import { getClassPrefix } from '../../_util/classname';
77
import { TdChatContentProps } from '../../chatbot';
8-
import { MessageStatus, ReferenceItem } from '../../chatbot/core/type';
8+
import { ChatMessageStatus, ReferenceItem } from '../../chatbot/core/type';
99
import { CollapseValue } from '../../collapse';
1010

1111
import styles from '../style/chat-item.less';
@@ -18,7 +18,7 @@ type SearchContent = {
1818
};
1919
export type TdChatSearchContentProps = {
2020
content?: SearchContent;
21-
status?: MessageStatus | ((currentStatus: MessageStatus | undefined) => MessageStatus);
21+
status?: ChatMessageStatus | ((currentStatus: ChatMessageStatus | undefined) => ChatMessageStatus);
2222
onChange?: (value: CollapseValue) => void;
2323
handleSearchResultClick?: ({ event, content }: { event: MouseEvent; content: SearchContent }) => void;
2424
handleSearchItemClick?: ({ event, content }: { event: MouseEvent; content: ReferenceItem }) => void;

src/chat-message/content/thinking-content.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { Component, OmiProps, signal, tag } from 'omi';
88

99
import { getClassPrefix } from '../../_util/classname';
1010
import { convertToLightDomNode } from '../../_util/lightDom';
11-
import type { MessageStatus, TdChatContentProps } from '../../chatbot';
11+
import type { ChatMessageStatus, TdChatContentProps } from '../../chatbot';
1212
import { CollapseValue } from '../../collapse';
1313

1414
import styles from '../style/chat-item.less';
@@ -20,7 +20,7 @@ export type TdChatThinkContentProps = {
2020
text?: string;
2121
title?: string;
2222
};
23-
status?: MessageStatus | ((currentStatus: MessageStatus | undefined) => MessageStatus);
23+
status?: ChatMessageStatus | ((currentStatus: ChatMessageStatus | undefined) => ChatMessageStatus);
2424
} & TdChatContentProps['thinking'];
2525

2626
export interface IRenderThinking extends TdChatThinkContentProps {
@@ -38,7 +38,7 @@ export const renderThinking = ({
3838
onChange,
3939
}: IRenderThinking) => {
4040
const defaultCollapsed = collapsed ? [] : [1];
41-
const renderThinkingStatus = (s: MessageStatus) => {
41+
const renderThinkingStatus = (s: ChatMessageStatus) => {
4242
if (s === 'complete' || s === 'stop')
4343
return convertToLightDomNode(<t-icon-check-circle class={`${className}__think__status--complete`} />);
4444
if (s === 'error')
@@ -73,7 +73,7 @@ export const renderThinking = ({
7373
</t-auto-scroll>
7474
)}
7575
<div slot="header" className={`${className}__think__header__content`}>
76-
{status !== 'stop' && renderThinkingStatus(status as MessageStatus)}
76+
{status !== 'stop' && renderThinkingStatus(status as ChatMessageStatus)}
7777
{status === 'stop' ? '思考已终止' : title}
7878
</div>
7979
</t-collapse-panel>

src/chat-sender/_example/custom.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,11 @@ export default class CustomExample extends Component {
9494
onSend={this.onSend}
9595
>
9696
{this.renderPanel()}
97-
<div slot="prefix" className="prefix" onClick={() => this.senderRef.current?.selectFile()}>
97+
<div slot="input-prefix" className="prefix" onClick={() => this.senderRef.current?.selectFile()}>
9898
<t-icon-focus className="icon" />
9999
</div>
100100
<div slot="inner-header">我是innerHeader</div>
101-
<div slot="footer-left">
101+
<div slot="footer-prefix">
102102
<t-button
103103
onClick={() => {
104104
this.panel.value = true;

src/chat-sender/chat-sender.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ export default class ChatSender extends Component<TdChatSenderProps> {
227227
<div className={`${className}__content`}>
228228
<slot name="inner-header"></slot>
229229
<div className={`${className}__textarea__wrapper`}>
230-
<slot name="prefix"></slot>
230+
<slot name="input-prefix"></slot>
231231
<t-textarea
232232
ref={this.inputRef}
233233
className={`${className}__textarea`}
@@ -248,7 +248,7 @@ export default class ChatSender extends Component<TdChatSenderProps> {
248248
</div>
249249
<div className={`${className}__footer`}>
250250
<div className={`${className}__footer__left`}>
251-
<slot name="footer-left"></slot>
251+
<slot name="footer-prefix"></slot>
252252
</div>
253253
<div className={`${className}__footer__right`}>
254254
<div className={`${className}__actions`}>

src/chatbot/README.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ spline: base
7272
|--------|------|
7373
| `sender-header` | 输入框头部内容 |
7474
| `sender-inner-header` | 输入框边框内头部内容 |
75-
| `sender-footer-left` | 输入框底部左侧内容 |
75+
| `sender-footer-prefix` | 输入框底部左侧内容 |
7676
| `sender-actions` | 输入框操作按钮 |
7777
| `[message-id]` | 特定消息ID的自定义内容 |
7878

@@ -88,10 +88,10 @@ spline: base
8888
| name | `string` \| `TNode` | 作者名称或自定义渲染节点 |
8989
| avatar | `string` \| `TNode` | 头像URL或自定义渲染节点 |
9090
| datetime | `string` \| `TNode` | 时间显示或自定义渲染节点 |
91-
| role | `MessageRole` | 消息角色类型 |
91+
| role | `ChatMessageRole` | 消息角色类型 |
9292
| variant | `'base'` \| `'text'` \| `'outline'` | 消息气泡样式变体 |
9393
| placement | `'left'` \| `'right'` | 消息气泡位置 |
94-
| chatContentProps | `{[key in ContentType]?: {}}` | 可以针对不同内容类型进行定制化配置。ContentType类型有`text``markdown``search``thinking``suggestion`|
94+
| chatContentProps | `{[key in ChatContentType]?: {}}` | 可以针对不同内容类型进行定制化配置。ContentType类型有`text``markdown``search``thinking``suggestion`|
9595
| onMessageChange | `(e: CustomEvent<ChatMessagesData[]>) => void` | 消息更新时触发 |
9696

9797
### ChatServiceConfig属性
@@ -126,21 +126,21 @@ type ChatMessagesData = UserMessage | AIMessage | SystemMessage;
126126

127127
## 角色消息类型
128128

129-
### 公共基础属性 (BaseMessage)
129+
### 公共基础属性 (ChatBaseMessage)
130130

131-
所有消息类型都继承自 `BaseMessage`,包含以下公共属性:
131+
所有消息类型都继承自 `ChatBaseMessage`,包含以下公共属性:
132132

133133
| 属性名 | 类型 | 说明 |
134134
|--------|------|------|
135135
| id | string | 消息唯一标识符 |
136-
| status | `MessageStatus` | 消息状态:'pending'(等待中)、'streaming'(流式传输中)、'complete'(完成)、'stop'(停止)、'error'(错误) |
136+
| status | `ChatMessageStatus` | 消息状态:'pending'(等待中)、'streaming'(流式传输中)、'complete'(完成)、'stop'(停止)、'error'(错误) |
137137
| datetime | string | 消息时间戳 (ISO 8601 格式) |
138138
| ext | any | 扩展数据,可存放自定义业务数据 |
139139

140140
### 1. SystemMessage (系统消息)
141141

142142
```typescript
143-
interface SystemMessage extends BaseMessage {
143+
interface SystemMessage extends ChatBaseMessage {
144144
role: 'system'; // 固定为'system'
145145
content: TextContent[]; // 仅支持纯文本内容
146146
}
@@ -149,7 +149,7 @@ interface SystemMessage extends BaseMessage {
149149
### 2. UserMessage (用户消息)
150150

151151
```typescript
152-
interface UserMessage extends BaseMessage {
152+
interface UserMessage extends ChatBaseMessage {
153153
role: 'user'; // 固定为'user'
154154
content: UserMessageContent[]; // 消息内容数组
155155
}
@@ -162,7 +162,7 @@ interface UserMessage extends BaseMessage {
162162
### 3. AIMessage (AI助手消息)
163163

164164
```typescript
165-
interface AIMessage extends BaseMessage {
165+
interface AIMessage extends ChatBaseMessage {
166166
role: 'assistant'; // 固定为'assistant'
167167
content: AIMessageContent[]; // 消息内容数组
168168
comment?: 'good' | 'bad'; // 用户反馈:'good'(点赞)、'bad'(点踩)
@@ -184,7 +184,7 @@ interface AIMessage extends BaseMessage {
184184
interface TextContent {
185185
type: 'text'; // 固定为'text'
186186
data: string; // 文本内容
187-
status?: MessageStatus; // 内容状态
187+
status?: ChatMessageStatus; // 内容状态
188188
id?: string; // 内容ID
189189
}
190190
```
@@ -195,7 +195,7 @@ interface TextContent {
195195
interface AttachmentContent {
196196
type: 'attachment'; // 固定为'attachment'
197197
data: AttachmentItem[]; // 附件项数组
198-
status?: MessageStatus; // 内容状态
198+
status?: ChatMessageStatus; // 内容状态
199199
id?: string; // 内容ID
200200
}
201201

src/chatbot/_example/input.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export default class ChatSender extends Component {
6363
};
6464

6565
renderModel = () => (
66-
<div className={`${className}__model`} slot="footer-left">
66+
<div className={`${className}__model`} slot="footer-prefix">
6767
<t-dropdown
6868
options={[
6969
{ value: 'hunyuan', content: 'HunYuan' },

src/chatbot/chat.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ export default class Chatbot extends Component<TdChatProps> implements TdChatbot
353353
* 渲染输入框插槽
354354
*/
355355
private renderInputSlots = () => {
356-
// sender-header、sender-footer-left、sender-actions、sender-sender
356+
// sender-header、sender-footer-prefix、sender-actions、sender-sender
357357
const itemSlotNames = this.slotNames.filter((key) => key.includes('sender-'));
358358
return itemSlotNames.map((slotName) => {
359359
const str = slotName.replace(/^sender-/, '');

src/chatbot/core/store/message.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import {
22
type AIMessage,
33
type AIMessageContent,
44
type ChatMessagesData,
5+
ChatMessageStatus,
56
type ChatMessageStore,
6-
MessageStatus,
77
UserMessage,
88
} from '../type';
99
import { isAIMessage, isUserMessage } from '../utils';
@@ -166,7 +166,7 @@ export class MessageStore extends ReactiveState<ChatMessageStore> {
166166
return userMessages.at(-1);
167167
}
168168

169-
private resolvedStatus(content: AIMessageContent, status: MessageStatus): MessageStatus {
169+
private resolvedStatus(content: AIMessageContent, status: ChatMessageStatus): ChatMessageStatus {
170170
return typeof content.status === 'function' ? content.status(status) : content.status;
171171
}
172172

src/chatbot/core/type.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
export type MessageRole = 'user' | 'assistant' | 'system';
2-
export type MessageStatus = 'pending' | 'streaming' | 'complete' | 'stop' | 'error';
3-
export type ChatStatus = 'idle' | MessageStatus;
4-
export type ContentType =
1+
export type ChatMessageRole = 'user' | 'assistant' | 'system';
2+
export type ChatMessageStatus = 'pending' | 'streaming' | 'complete' | 'stop' | 'error';
3+
export type ChatStatus = 'idle' | ChatMessageStatus;
4+
export type ChatContentType =
55
| 'text'
66
| 'markdown'
77
| 'search'
@@ -17,7 +17,7 @@ export type AttachmentType = 'image' | 'video' | 'audio' | 'pdf' | 'doc' | 'ppt'
1717
export interface ChatBaseContent<T extends string, TData> {
1818
type: T;
1919
data: TData;
20-
status?: MessageStatus | ((currentStatus: MessageStatus | undefined) => MessageStatus);
20+
status?: ChatMessageStatus | ((currentStatus: ChatMessageStatus | undefined) => ChatMessageStatus);
2121
id?: string;
2222
}
2323

@@ -86,9 +86,9 @@ export type ThinkingContent = ChatBaseContent<
8686
// 消息主体
8787
// 基础消息结构
8888

89-
export interface BaseMessage {
89+
export interface ChatBaseMessage {
9090
id: string;
91-
status?: MessageStatus;
91+
status?: ChatMessageStatus;
9292
datetime?: string;
9393
ext?: any;
9494
}
@@ -118,21 +118,21 @@ export type AIContentType = keyof AIContentTypeMap;
118118
export type AIMessageContent = AIContentTypeMap[AIContentType];
119119
export type UserMessageContent = TextContent | AttachmentContent;
120120

121-
export interface UserMessage extends BaseMessage {
121+
export interface UserMessage extends ChatBaseMessage {
122122
role: 'user';
123123
content: UserMessageContent[];
124124
}
125125

126126
export type ChatComment = 'good' | 'bad' | '';
127127

128-
export interface AIMessage extends BaseMessage {
128+
export interface AIMessage extends ChatBaseMessage {
129129
role: 'assistant';
130130
content?: AIMessageContent[];
131131
/** 点赞点踩 */
132132
comment?: ChatComment;
133133
}
134134

135-
export interface SystemMessage extends BaseMessage {
135+
export interface SystemMessage extends ChatBaseMessage {
136136
role: 'system';
137137
content: TextContent[];
138138
}

src/chatbot/type.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import { type TdChatSenderProps } from '../chat-sender';
55
import type { StyledProps, TNode } from '../common';
66
import type {
77
AIMessageContent,
8+
ChatContentType,
89
ChatRequestParams,
910
ChatServiceConfigSetter,
1011
ChatStatus,
11-
ContentType,
1212
} from './core/type';
1313
import type { ChatMessagesData } from './core/type';
1414

@@ -24,7 +24,7 @@ export type TdChatContentProps = {
2424
thinking?: TdChatContentThinkProps;
2525
suggestion?: TdChatContentSuggestionProps;
2626
[key: string]: any; // 处理其他ContentType情况
27-
} & Partial<Record<Exclude<ContentType, 'markdown' | 'search' | 'thinking' | 'suggestion'>, any>>;
27+
} & Partial<Record<Exclude<ChatContentType, 'markdown' | 'search' | 'thinking' | 'suggestion'>, any>>;
2828

2929
export interface TdChatItemProps {
3030
/**

0 commit comments

Comments
 (0)