3. 给 Bubble 新增一个 Agent Variant
3. ç» Bubble æ°å¢ä¸ä¸ª Agent Variant
one_last_FE 2026-08-17 0 é 读3åéç» Bubble æ°å¢ä¸ä¸ª Agent Variant
åè¨
ä¸ä¸ç¯å·²ç»æ¢³çäº Bubble ç»ä»¶ç坿¹é ç¹ã
妿è¦ä»ç®åå°é¾åäºæ¬¡å®å¶ï¼æå»ºè®®ç¬¬ä¸ä¸ªå®é æ¹é ç¹å°±æ¯ï¼
ç»
Bubbleæ°å¢ä¸ç§éå Agent 产åçvariantã
åå å¾ç®åã
variant å±äºæ ·å¼å交äºå±ç¤ºå±çæ©å±ï¼é£é©æ¯è¾ä½ï¼ä½ææå¾ç´è§ãå®ä¸æ¶åå端éä¿¡ï¼ä¹ä¸æ¶åå¤æçæ°æ®åè®®ï¼å´è½è®©ç»ä»¶ä»âæ®éèå¤©æ°æ³¡â鿏åæâAgent å·¥ä½å°æ¶æ¯âã
è¿ç¯æç« 就以æ°å¢
variant="agent"为ä¾ï¼æ¢³çå®ç设计æè·¯åä¿®æ¹ä½ç½®ã
variant æ¯ä»ä¹
å¨ç»ä»¶åºéï¼variant é常表示åä¸ä¸ªç»ä»¶çä¸åè§è§å½¢æã
æ¯å¦åä¸ä¸ª Bubbleï¼å¯ä»¥æè¿äºæ ·å¼ï¼
| variant | 说æ |
|---|---|
filled | é»è®¤å¡«å èæ¯ |
borderless | æ è¾¹æ¡ãå¼±èæ¯ |
outlined | è¾¹æ¡æ ·å¼ |
shadow | é´å½±å¡çæ ·å¼ |
agent | Agent å·¥ä½å°æ ·å¼ |
å®ä»¬æ¬è´¨ä¸è¿æ¯åä¸ä¸ª Bubble ç»ä»¶ï¼åªæ¯å¤è§åå±é¨äº¤äºè¡¨ç°ä¸åã
ä½¿ç¨æ¹å¼å¤§æ¦æ¯ï¼
<Bubble
variant="agent"
content="ææ¯ikunã"
/>
è¿æ ·ä¸å¡ä¾§ä¸ç¨å
³å¿å
é¨ class æä¹æ¼ï¼ä¹ä¸ç¨æ¯æ¬¡é½æåä¸å æ ·å¼ï¼åªéè¦ä¼ å
¥ä¸ä¸ªç»ä¸ç variantã
为ä»ä¹éè¦ Agent Variant
æ®éè天产åå Agent 产åçæ¶æ¯å±ç¤ºæ¹å¼ä¸å¤ªä¸æ ·ã
æ®éèå¤©äº§åæ´å峿¶é讯ï¼
ç¨æ·ï¼å¸®æçä¸ä¸è¿ä¸ªç»ä»¶ã
AIï¼å¥½çï¼ææ¥å¸®ä½ çã
è¿ç§åºæ¯ä¸ï¼å·¦å³æ°æ³¡å°±å¤ç¨äºã
ä½ Agent äº§åæ´åä¸ä¸ªå·¥ä½å°ï¼AI åå¤é常æ´é¿ï¼ä¹æ´ç»æåï¼
AI
æå·²ç»åæäº Bubble ç»ä»¶ï¼ä¸»è¦ç»è®ºå¦ä¸ï¼
1. Bubble è´è´£åæ¡æ¶æ¯å±ç¤º
2. BubbleList è´è´£æ¶æ¯å表
3. typing é»è¾å¨ hooks ä¸å¤ç
4. variant å¯ä»¥ä½ä¸ºæ ·å¼æ©å±å
¥å£
è¿ç§æ¶æ¯å¦æè¿ç¨å¾éçèå¤©æ°æ³¡å èµ·æ¥ï¼ä¼æ¾å¾æ¥æ¤ã
æä»¥ Agent 飿 ¼ç Bubble å¯ä»¥èèï¼
- AI æ¶æ¯æ´åå 容åï¼è䏿¯æ®éæ°æ³¡
- èæ¯æ´è½»,éé å ¬å¸ç主é¢èæ¯è²
- 宽度æ´éåé¿ææ¬
- è¾¹æ¡åé´å½±æ´å å¶
- å headerãfooterãactions æ´å®¹æç»å
- éåæ¿è½½ Markdownã代ç åãæä»¶å¡çãæèé¾ç夿å 容
å æ¤ï¼æ°å¢ agent variant çæä¹ä¸æ¯æ¹ä¸ä¸ªé¢è²ï¼èæ¯ç» Agent åºæ¯æä¾ä¸å¥ç¨³å®çæ¶æ¯å±ç¤ºé£æ ¼ã
å½å Bubble å·²ç»æ variant æºå¶
å¨å½å项ç®éï¼Bubble å·²ç»æ¯æ variantã
å¯ä»¥çï¼
// src/bubble/interface.ts
variant?: 'filled' | 'borderless' | 'outlined' | 'shadow';
ä¹å°±æ¯è¯´ï¼å½åå·²æåç§å ç½®æ ·å¼ï¼
filledborderlessoutlinedshadow
å¨ Bubble.vue ä¸ï¼ç»ä»¶ä¼æ ¹æ® variant çæ content ç classï¼
class={[
`${prefixCls}-content`,
`${prefixCls}-content-${variant}`,
{ [`${prefixCls}-content-${shape}`]: shape },
contextConfig.value.classNames.content,
classNames.content,
]}
妿 variant="filled"ï¼æç»å°±ä¼çæç±»ä¼¼è¿æ ·ç classï¼
class="ant-bubble-content ant-bubble-content-filled"
妿æ°å¢ variant="agent"ï¼æç»å°±ä¼çæï¼
class="ant-bubble-content ant-bubble-content-agent"
æä»¥è¿ä¸ªé¡¹ç®å·²ç»ææ©å±å ¥å£ç好äºã
æä»¬è¦åçæ¯ï¼
- æ©å±ç±»å
- å¢å æ ·å¼
- å¢å 示ä¾
- éªè¯ææ
ç¬¬ä¸æ¥ï¼æ©å±ç±»åå®ä¹
é¦å ä¿®æ¹ï¼
src/bubble/interface.ts
å½ååæ³æ¯ï¼
variant?: 'filled' | 'borderless' | 'outlined' | 'shadow';
å¯ä»¥æ©å±ä¸ºï¼
è¿æ ·ä½¿ç¨ç»ä»¶æ¶ï¼TypeScript å°±å è®¸ä¼ å ¥ï¼
<Bubble variant="agent" />
è¿ä¸æ¥çä½ç¨æ¯è®©ç»ä»¶ API æ£å¼æ¯ææ°å¼ã
妿䏿¹ç±»åï¼æ ·å¼å¯è½ä¹è½éè¿åç¬¦ä¸²ä¼ è¿å»ï¼ä½ç¼è¾å¨ä¼æ¥ç±»åé误ï¼ç»ä»¶åºå¯¹å¤ä½¿ç¨ä¹ä¸è§èã
ç¬¬äºæ¥ï¼ç¡®è®¤ Bubble.vue æ¯å¦éè¦æ¹
å½å Bubble.vue éå·²ç»æ ¹æ® variant èªå¨çæ classï¼
`${prefixCls}-content-${variant}`
æä»¥å¦æåªæ¯æ°å¢ä¸ç§æ ·å¼åæ¯ï¼Bubble.vue ä¸ä¸å®éè¦æ¹ã
è¿æ¯ä¸ä¸ªå¾å¥½çç»ä»¶è®¾è®¡ç¹ã
å ä¸ºå®æ²¡æææ¯ä¸ª variant åæ»ææ¡ä»¶å¤æï¼
if (variant === 'filled') {}
if (variant === 'outlined') {}
èæ¯ç»ä¸æ¼æ¥ classã
è¿æ ·æ°å¢ä¸ä¸ª variant çææ¬å°±å¾ä½ã
ä¹å°±æ¯è¯´ï¼agent variant 主è¦éè¦æ¹ç±»ååæ ·å¼ï¼ä¸éè¦å¤§æ¹æ¸²æé»è¾ã
ç¬¬ä¸æ¥ï¼å¢å æ ·å¼
Bubble ç variant æ ·å¼å¨ï¼
src/bubble/style/content.ts
å½å genVariantStyle 大è´ç»ææ¯ï¼
æ°å¢ agent æ¶ï¼å¯ä»¥å¨è¿éå¢å 䏿®µï¼
'&-agent': {
padding: `${unit(token.padding)} ${unit(token.paddingLG)}`,
borderRadius: token.borderRadiusLG,
backgroundColor: token.colorBgContainer,
border: `1px solid ${token.colorBorderSecondary}`,
}
è¿æ · ant-bubble-content-agent 就伿èªå·±çæ ·å¼ã
ä¸è¿åªå è¿ä¸æ®µè¿æ¯è¾æ®éã
妿æ³è®©å®æ´å Agent æ¶æ¯ï¼å¯ä»¥ç¨å¾®è®¾è®¡å¾æ´ææ¾ä¸äºï¼
'&-agent': {
padding: `${unit(token.padding)} ${unit(token.paddingLG)}`,
borderRadius: token.borderRadiusLG,
backgroundColor: token.colorBgContainer,
border: `1px solid ${token.colorBorderSecondary}`,
boxShadow: token.boxShadowTertiary,
}
è¿æ · AI æ¶æ¯ä¼æ´åä¸ä¸ªå 容åã
ä½ä¹è¦æ³¨æï¼ä¸è¦ä¸ä¸æ¥æ ·å¼å¤ªéãAgent æ¶æ¯é常å 容è¾é¿ï¼å¦æèæ¯ãè¾¹æ¡ãé´å½±é½å¾å¼ºï¼ä¼å½±åé 读ã
ç¬¬åæ¥ï¼èè placement çå·®å¼
Bubble è¿æä¸ä¸ªéè¦å±æ§ï¼
placement?: 'start' | 'end';
ä¸è¬æ¥è¯´ï¼
placement="start"表示 AI æ¶æ¯ï¼é å·¦placement="end"è¡¨ç¤ºç¨æ·æ¶æ¯ï¼é å³
妿 agent variant 主è¦ç¨äº AI æ¶æ¯ï¼å¯ä»¥è®©å®æ´éå startã
ä¾å¦ï¼
<Bubble
placement="start"
variant="agent"
content="ææ£å¨åæè¿ä¸ªç»ä»¶ã"
/>
ç¨æ·æ¶æ¯ä»ç¶å¯ä»¥ä½¿ç¨é»è®¤ç filledï¼
<Bubble
placement="end"
variant="filled"
content="帮æçä¸ä¸ Bubbleã"
/>
è¿æ ·å°±è½å½¢æä¸ç§æ¯è¾èªç¶ç Agent 对è¯é£æ ¼ï¼
- ç¨æ·æ¶æ¯çï¼å³ä¾§æ°æ³¡
- AI æ¶æ¯é¿ï¼å·¦ä¾§å 容å
è¿ä¸ç¹å¾éååè¿å ¬å¸å®å¶æ¹æ¡éã
ç¬¬äºæ¥ï¼å¨ play ä¸éªè¯
æ°å¢ variant åï¼åºè¯¥å¨ play éå ä¸ä¸ªç®å示ä¾ã
æ¯å¦å¨ï¼
play/src/App.vue
åä¸ä¸ªå¯¹æ¯ demoï¼
<template>
<div class="demo">
<Bubble
placement="end"
variant="filled"
content="帮æçä¸ä¸ Bubble ç»ä»¶å¯ä»¥æä¹æ¹ã"
/>
<Bubble
placement="start"
variant="agent"
content="æå·²ç»åæäº Bubble ç»ä»¶ãå®ä¸»è¦å¯ä»¥ä»æ ·å¼å±ãææ§½å±ãç¶æå±åå表å±è¿è¡æ¹é ã"
/>
</div>
</template>
å¦æè¦æ´åçå® Agent 产åï¼å¯ä»¥å ä¸ header å footerï¼
<Bubble
placement="start"
variant="agent"
content="æå·²ç»åæäº Bubble çæºç ç»æï¼ä¸é¢æ¯å 个建议修æ¹ç¹ã"
>
<template #header>
AI Assistant
</template>
<template #footer>
<button>å¤å¶</button>
<button>éæ°çæ</button>
</template>
</Bubble>
è¿ä¸ª demo ä¸éè¦æ¥å端ï¼ä¹ä¸éè¦åçå®åéã
å®çç®çåªæ¯éªè¯ï¼
- æ° variant æ¯å¦çæ
- å¸å±æ¯å¦åç
- AI æ¶æ¯åç¨æ·æ¶æ¯æ¯å¦æææ¾åºå
- header/footer æ¯å¦è½æ£å¸¸ç»å
- é¿ææ¬é 读ä½éªæ¯å¦èæ
ç¬¬å æ¥ï¼èè BubbleList ä¸çè§è²é ç½®
å个 Bubble å¯ä»¥ç´æ¥ä¼ variantã
ä½çå®å¯¹è¯éä¸è¬ä¼ç¨ BubbleListã
BubbleList æ¯æéè¿ roles ç»ä¸åè§è²é
ç½®é»è®¤å±æ§ã
ä¾å¦å¯ä»¥è¿æ ·è®¾è®¡ï¼
const roles = {
assistant: {
placement: 'start',
variant: 'agent',
},
user: {
placement: 'end',
variant: 'filled',
},
};
è¿æ ·æ¶æ¯æ°æ®éåªéè¦å roleï¼
const items = [
{
key: '1',
role: 'user',
content: '帮æçä¸ä¸ Bubbleã',
},
{
key: '2',
role: 'assistant',
content: 'æå·²ç»çå®äºï¼å®ä¸»è¦è´è´£åæ¡æ¶æ¯å±ç¤ºã',
},
];
æç»æææ¯ï¼
- user èªå¨ç¨
filled - assistant èªå¨ç¨
agent
è¿æ¯æ¯æ¡æ¶æ¯é½æå¨å variant æ´éåä¸å¡åºæ¯ã
å æ¤ï¼agent variant ä¸åªæ¯å个ç»ä»¶çæ ·å¼æ©å±ï¼ä¹å¯ä»¥æä¸ºæ¶æ¯è§è²ç³»ç»çä¸é¨åã
agent variant å¯ä»¥æä¹è®¾è®¡
æä¸ªäººæ´å»ºè®® agent variant åæè½»éå·¥ä½å°é£æ ¼ï¼è䏿¯ä¼ ç»å¡ç飿 ¼ã
å¯ä»¥èèè¿äºç¹å¾ï¼
| è®¾è®¡ç¹ | 建议 |
|---|---|
| èæ¯ | 使ç¨å¼±èæ¯æç½è²èæ¯ |
| è¾¹æ¡ | ä½¿ç¨æµ è¾¹æ¡ï¼å¢å¼ºå 容边ç |
| åè§ | ä¸çåè§ï¼ä¸è¦è¿äºå润 |
| é´å½± | å¯ä»¥å¾å¼±ï¼æè ä¸å |
| 宽度 | æ¯æ®éæ°æ³¡æ´å®½ |
| padding | æ¯æ®éæ°æ³¡æ´å¤§ï¼éåé¿ææ¬ |
| footer | éåæ¾å¤å¶ãéæ°çæãåé¦æé® |
| content | éåæ¿è½½ Markdown åç»æåå 容 |
ä¹å°±æ¯è¯´ï¼å®åºè¯¥æ´åï¼
AI Assistant
æå·²ç»åæå®è¿ä¸ªç»ä»¶ï¼ä¸»è¦æä»¥ä¸å ç¹ï¼
1. ...
2. ...
3. ...
[å¤å¶] [éæ°çæ] [åé¦]
è䏿¯ï¼
[ ä¸å¤§æ®µå
容æ¤å¨ä¸ä¸ªè天泡泡é ]
为ä»ä¹ä¸ç´æ¥æ¹ filled
å¯è½ä¼æä¸ä¸ªçé®ï¼
æ¢ç¶é»è®¤ç filled ä¸éå Agent 产åï¼ä¸ºä»ä¹ä¸ç´æ¥æ¹ filledï¼
åå æ¯ï¼
filledæ¯éç¨æ ·å¼ï¼agentæ¯ä¸å¡åºæ¯æ ·å¼ã
å¦æç´æ¥æ¹ filledï¼ä¼å½±åææä½¿ç¨é»è®¤å¡«å
æ ·å¼çå°æ¹ã
èæ°å¢ agent ç好夿¯ï¼
- ä¸ç ´ååæè½å
- å ¼å®¹å·²æç¤ºä¾
- ä¸å¡ä¾§å¯ä»¥æééæ©
- åç»å¯ä»¥ç»§ç»æ©å±
- æ´ç¬¦åç»ä»¶åºè®¾è®¡æ¹å¼
ç»ä»¶åºéæ¯è¾éè¦çä¸ç¹å°±æ¯ä¸è¦è½»æç ´åé»è®¤è¡ä¸ºã
æä»¥æ°å¢ variant é常æ¯ç´æ¥è¦çé»è®¤æ ·å¼æ´ç¨³ã
è¿ä¸ªæ¹é çå·¥ä½éæä¹æè¿°
éè¦æ³¨æçé®é¢
æ°å¢ variant çèµ·æ¥ç®åï¼ä½æå 个ç¹è¦æ³¨æã
第ä¸ï¼ä¸è¦åªæ¹æ ·å¼ï¼ä¸æ¹ç±»åã
妿åªå äº CSSï¼ä½ interface.ts éæ²¡æå agentï¼ä¸å¡ä¾§ä½¿ç¨æ¶ä¼æç±»åé误ã
第äºï¼ä¸è¦æä¸å¡é»è¾å¡è¿ variantã
variant åºè¯¥ä¸»è¦æ§å¶å¤è§ï¼ä¸åºè¯¥è´è´£è¯·æ±æ¥å£ãå¤ææ¶æ¯ç¶æãè§£æå·¥å
·è°ç¨ã
第ä¸ï¼ä¸è¦å½±åå·²æ variantã
æ°å¢ agent æ¶ï¼ä¸åºè¯¥ç ´å filledãoutlinedãshadow çåæè¡¨ç°ã
第åï¼æå¥½å demoã
ç»ä»¶åºçæ¹å¨å¦ææ²¡æç¤ºä¾ï¼åé¢å«äººå¾é¾çè§£è¿ä¸ª variant åºè¯¥æä¹ç¨ã
æ¨èä¿®æ¹æä»¶
å¦æçæ£è½å°è¿ä¸ªæ¹é ï¼ä¸»è¦æ¶åè¿äºæä»¶ï¼
src/bubble/interface.ts
src/bubble/style/content.ts
play/src/App.vue
å ¶ä¸ï¼
| æä»¶ | ä½ç¨ |
|---|---|
src/bubble/interface.ts | æ©å± variant ç±»å |
src/bubble/style/content.ts | æ°å¢ agent æ ·å¼ |
play/src/App.vue | å¢å 示ä¾åè§è§éªè¯ |
å½å Bubble.vue å·²ç»ä¼èªå¨çæ ${prefixCls}-content-${variant}ï¼æä»¥ä¸ä¸å®éè¦æ¹ã
è¿æ¯å 为ç»ä»¶åæ¬çæ©å±æ¹å¼æ¯è¾åçã
æ»ç»
æ°å¢ agent variant æ¯ä¸ä¸ªå¾éåä½ä¸º Bubble äºæ¬¡å®å¶ç¬¬ä¸æ¥çæ¹é ç¹ã
å®çä¼ç¹æ¯ï¼
- é¾åº¦ä½
- é£é©å°
- ææç´è§
- 䏿¶åéä¿¡å±
- è½ä½ç°ç»ä»¶åºæ©å±æè·¯
- éåå ¬å¸ Agent UI å®å¶
å®çæ ¸å¿æ¹é è·¯å¾æ¯ï¼
æ©å± variant ç±»å
-> å¢å agent æ ·å¼
-> å¨ play ä¸éªè¯
-> å¨ BubbleList roles ä¸ä½¿ç¨
è¿ä¸ªæ¹é 宿åï¼Bubble å°±ä¸åªæ¯æ®éèå¤©æ°æ³¡ï¼èæ¯å¯ä»¥å¼å§æ¿è½½æ´å Agent å·¥ä½å°çæ¶æ¯å±ç¤ºå½¢æã
ä¸ä¸æ¥å¯ä»¥ç»§ç»å´ç» agent variant åæ¶æ¯æä½åºï¼æ¯å¦å¤å¶ãéæ°çæãç¹èµãç¹è¸©ç交äºã
Aitishiku.com