# ð± äžäžææš¡åŒéæ - UI è®Ÿè®¡åææ¥å
> **ææ¡£çæ¬**: v2.0
> **åå»ºæ¥æ**: 2025-10-21
> **æåæŽæ°**: 2025-10-22
> **åæèåŽ**: äžäžææš¡åŒ (User/System) UI ç»ä»¶è®Ÿè®¡ + åéç³»ç»éæ
> **ç¶æ**: â
v1.1æ¹é 已宿ïŒð v2.0åéç³»ç»éæåŸ
宿œ
---
## ð¢ éèŠæŽæ°
### â
v1.1 UIæ¹é (已宿 - 2025-10-22)
1. **åæš¡åŒéæ©åšäœçœ®è°æŽ** â
已宿
- **é®é¢**: åæš¡åŒéæ©åšäœäºå·¥äœåºå
ïŒå±çº§æ··ä¹±
- **æ¹æ¡**: ç§»åšå°å¯Œèªæ ïŒçާé»åèœæš¡åŒéæ©åšå³äŸ§
- **ç¶æ**: â
已宿
- **æäº€**: ä¹å已宿
2. **å¿«æ·æäœæ äœçœ®è°æŽ** â
已宿
- **é®é¢**: å¿«æ·æäœæ åšå·ŠäŸ§äŒååºïŒäœçšåäžæç¡®
- **æ¹æ¡**: ç§»åšå°å³äŸ§æµè¯åºé¡¶éšïŒèŽŽè¿äœ¿çšåºæ¯
- **ç¶æ**: â
已宿
- **æäº€**: `ce90d47` - refactor(ui): äŒåäžäžææš¡åŒå¿«æ·æäœæ äœçœ®
### ð v2.0 åéç³»ç»éæ (åŸ
宿œ)
3. **åéç³»ç»ç®å** ðŽ é«äŒå
级
- **é®é¢**: "å
šå±åé"å"äŒè¯åé"æŠå¿µæ··æ·ïŒå®é
éœæ¯æä¹
ååé
- **æ¹æ¡**: ç§»é€äŒè¯åéïŒåŒå
¥æµè¯åºäžŽæ¶åé
- **ç¶æ**: â
已宿ïŒäœäžºåœæ¡£è®°åœïŒ
- **诊æ
**: è§ [åéç³»ç»éæè®Ÿè®¡ææ¡£](./design.md)
### ð æ¹é 颿ææ
**æ¹é å:**
```
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Prompt Optimizer | [åºç¡|äžäžæ|åŸå] | ððâïž... â
ââââââââââââââââââââââââââ¬ââââââââââââââââââââââââââââââââ€
â [ððð§] â æµè¯åº â
â ââââââââââââââââââââââ â â
â [ç³»ç»|çšæ·] [æš¡åâŸ] â â
â èŸå
¥æ¡... â â
ââââââââââââââââââââââââââŽââââââââââââââââââââââââââââââââ
â é®é¢1: å±çº§æ··ä¹± â é®é¢2: æäœè·çŠ»è¿
```
**æ¹é å:**
```
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Prompt Optimizer â
â [åºç¡|äžäžæ|åŸå] [ç³»ç»|çšæ·] ððâïž... â
â â åèœæš¡åŒ â åæš¡åŒïŒåšææŸç€ºïŒ â
ââââââââââââââââââââââââââ¬ââââââââââââââââââââââââââââââââ€
â äŒååº â æµè¯åº â
â â âââââââââââââââââââââââââââââ â
â [æš¡åâŸ] [æš¡æ¿âŸ] â â æµè¯ ðå
šå± ðäŒè¯ ð§å·¥å
· â â
â èŸå
¥æ¡... â âââââââââââââââââââââââââââââ â
â (空éŽå¢å ) â åéèŸå
¥... â
ââââââââââââââââââââââââââŽââââââââââââââââââââââââââââââââ
```
**æ¹è¿ææ:**
- â
å±çº§æž
æ°ïŒåèœæš¡åŒååæš¡åŒåšåäžå¯Œèªæ
- â
äœçšåæç¡®ïŒå¿«æ·æäœæ åšæµè¯åºïŒèŽŽè¿äœ¿çšåºæ¯
- â
空éŽäŒåïŒäŒååºåçŽç©ºéŽå¢å
- â
æäœäŸ¿æ·ïŒæµè¯æ¶è®Ÿçœ®åéïŒæäœè·¯åŸæç
---
## äžãæŽäœæ¶æè®Ÿè®¡
### 1.1 ç»ä»¶å±æ¬¡ç»æ
```
App.vue (äž»åºçš)
âââ ContextUserWorkspace.vue (çšæ·æš¡åŒå·¥äœåº)
â âââ ContextModeActions (å¿«æ·æäœæé®)
â âââ InputPanelUI (æç€ºè¯èŸå
¥)
â âââ PromptPanelUI (äŒåç»æ)
â âââ TestAreaPanel (æµè¯åºå)
â
âââ ContextSystemWorkspace.vue (ç³»ç»æš¡åŒå·¥äœåº)
âââ ContextModeActions (å¿«æ·æäœæé®)
âââ InputPanelUI (æç€ºè¯èŸå
¥)
âââ ConversationManager (äŒè¯ç®¡çåš) â ç³»ç»æš¡åŒäžå±
âââ PromptPanelUI (äŒåç»æ)
âââ TestAreaPanel (æµè¯åºå)
å
±äº«ç»ä»¶:
âââ ContextEditor.vue (äžäžæçŒèŸåš - æš¡ææ¡)
âââ PromptPreviewPanel.vue (é¢è§é¢æ¿ - æš¡ææ¡)
âââ TestAreaPanel.vue (æµè¯åºå - å€çš)
```
**ç»ä»¶æä»¶äœçœ®:**
```
packages/ui/src/components/
âââ context-mode/
â âââ ContextUserWorkspace.vue
â âââ ContextSystemWorkspace.vue
â âââ ContextModeActions.vue
â âââ ContextEditor.vue
â âââ ConversationManager.vue
âââ PromptPreviewPanel.vue
âââ TestAreaPanel.vue
âââ InputPanel.vue
âââ PromptPanel.vue
packages/ui/src/composables/
âââ usePromptPreview.ts
```
### 1.2 讟计暡åŒ
â
**éçšäºäŒç§ç讟计暡åŒ:**
1. **ç»åäŒäºç»§æ¿**
- User/System Workspace æ¯ç¬ç«ç»ä»¶èéç»§æ¿
- é¿å
äºå€æç if-else æ¡ä»¶å€æ
2. **Props ååæ°æ®æµ**
- æææ°æ®éè¿ props äŒ å
¥
- éè¿ emit è§Šåç¶ç»ä»¶æŽæ°
- éµåŸª Vue 3 æäœ³å®è·µ
3. **Composable é»èŸå€çš**
- `usePromptPreview` æäŸå¯å€çšçé¢è§é»èŸ
- å犻 UI åäžå¡é»èŸ
4. **Slot ææ§œæ©å±**
- æš¡åéæ©ãç»ææŸç€ºçäœ¿çšææ§œå®ç°çµæŽ»æ§
- æ¯æäžååºæ¯çèªå®ä¹æž²æ
---
## äºãäž€ç§æš¡åŒç UI å·®åŒ
### 2.1 çšæ·æš¡åŒ (User Mode)
**æä»¶**: `packages/ui/src/components/context-mode/ContextUserWorkspace.vue`
**åžå±ç»æ:**
```
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ð å
šå±åé ð äŒè¯åé ð§ å·¥å
·ç®¡ç â â å¿«æ·æäœ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â 巊䟧äŒååº â å³äŸ§æµè¯åº â
â âââââââââââââââââââââââ â âââââââââââââââââââââââââ
â â æç€ºè¯èŸå
¥é¢æ¿ â â â åéåŒèŸå
¥è¡šå ââ
â â "åäžéŠ{{style}}çæ"â â â style: [欢快____] ââ
â âââââââââââââââââââââââ â âââââââââââââââââââââââââ
â âââââââââââââââââââââââ â âââââââââââââââââââââââââ
â â äŒåç»æé¢æ¿ â â â é¢è§å
容 ââ
â â "请åäœäžéŠé£æ Œäžº â â â "请åäœäžéŠé£æ Œäžº ââ
â â {{style}}çæ..." â â â æ¬¢å¿«çæ..." ââ
â âââââââââââââââââââââââ â âââââââââââââââââââââââââ
â â âââââââââââââââââââââââââ
â â â æµè¯ç»æ ââ
â â â (LLM ååº) ââ
â â âââââââââââââââââââââââââ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
```
**æ žå¿ç¹ç¹:**
- â **éè** äŒè¯æ¶æ¯å衚管ç
- â
**æŸç€º** å·¥å
·ç®¡çæé®
- â
åæ¡çšæ·æ¶æ¯äŒå
- â
äž€é¶æ®µåéå€çïŒäŒåä¿ç â æµè¯æ¿æ¢ïŒ
- â
æ éèŸå
¥æµè¯é®é¢ïŒæç€ºè¯å³æµè¯å
容ïŒ
**代ç ç¹åŸ:**
```vue
ð
ð
ð§
```
### 2.2 ç³»ç»æš¡åŒ (System Mode)
**æä»¶**: `packages/ui/src/components/context-mode/ContextSystemWorkspace.vue`
**åžå±ç»æ:**
```
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ð å
šå±åé ð äŒè¯åé â â å¿«æ·æäœ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â 巊䟧äŒååº â å³äŸ§æµè¯åº â
â âââââââââââââââââââââââ â âââââââââââââââââââââââââ
â â æç€ºè¯èŸå
¥é¢æ¿ â â â åéåŒèŸå
¥è¡šå ââ
â â "äŒå以äžå¯¹è¯..." â â â style: [欢快____] ââ
â âââââââââââââââââââââââ â âââââââââââââââââââââââââ
â âââââââââââââââââââââââ â âââââââââââââââââââââââââ
â â äŒè¯ç®¡çåš [æå ] â â â æµè¯èŸå
¥ (çšæ·é®é¢) ââ
â â ⢠system: äœ æ¯... â â â "请çæäžéŠæ¬¢å¿«çæ" ââ
â â ⢠user: {{style}} â â âââââââââââââââââââââââââ
â â ⢠assistant: ... â â âââââââââââââââââââââââââ
â â [æåŒäžäžæçŒèŸåš] â â â é¢è§å
容 ââ
â âââââââââââââââââââââââ â â system: äœ æ¯ææ²åäœ ââ
â âââââââââââââââââââââââ â â user: 欢快 ââ
â â äŒåç»æé¢æ¿ â â âââââââââââââââââââââââââ
â â (äŒååç对è¯äžäžæ) â â âââââââââââââââââââââââââ
â âââââââââââââââââââââââ â â æµè¯ç»æ ââ
â â â (LLM ååº) ââ
â â âââââââââââââââââââââââââ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
```
**æ žå¿ç¹ç¹:**
- â
**æŸç€º** äŒè¯æ¶æ¯ç®¡çåšïŒå¯æå ïŒ
- â **éè** å·¥å
·ç®¡çæé®ïŒç³»ç»æš¡åŒäžçŽæ¥ç®¡çå·¥å
·ïŒ
- â
倿¶æ¯äžäžæçŒèŸ
- â
éèŠé¢å€çæµè¯èŸå
¥ (`userQuestion`)
- â
æ¯æ system/user/assistant/tool å€ç§è§è²
**代ç ç¹åŸ:**
```vue
ð
ð
```
---
## äžãå
³é®ç»ä»¶æ·±åºŠåæ
### 3.1 `ContextModeActions.vue` - å¿«æ·æäœæ
**æä»¶**: `packages/ui/src/components/context-mode/ContextModeActions.vue`
**讟计亮ç¹:**
```vue
ð
{{ $t('contextMode.actions.globalVariables') }}
ð
{{ $t('contextMode.actions.contextVariables') }}
ð§
{{ $t('contextMode.actions.tools') }}
```
**äŒç¹:**
- â
ç®æŽçæ¡ä»¶æž²æ (`v-if="contextMode === 'user'"`)
- â
è¯ä¹åç emoji åŸæ
- â
åœé
忝æ (`$t()`)
- â
ç±»åå®å
šç emit å®ä¹
**â ïž åœåé®é¢:**
**é®é¢**: è®Ÿè®¡ææ¡£äžæå°"å·¥å
·ç®¡ç - äž€ç§æš¡åŒéœæŸç€º"ïŒäœå®é
ä»£ç æ¯ `v-if="contextMode === 'user'"`
**圱å**: ç³»ç»æš¡åŒæ æ³ç®¡çå·¥å
·ïŒåŠæéèŠçè¯ïŒ
**建议**:
1. ç»äžè®Ÿè®¡ææ¡£åå®ç°ïŒæç¡®ç³»ç»æš¡åŒæ¯åŠéèŠå·¥å
·ç®¡ç
2. åŠæç³»ç»æš¡åŒä¹éèŠïŒç§»é€ `v-if` æ¡ä»¶
3. åŠæç¡®å®åªæçšæ·æš¡åŒéèŠïŒæŽæ°è®Ÿè®¡ææ¡£
---
### 3.2 `ConversationManager.vue` - äŒè¯ç®¡çåš
**æä»¶**: `packages/ui/src/components/context-mode/ConversationManager.vue`
**讟计亮ç¹:**
#### 1ïžâ£ **æ§èœäŒå**
```typescript
// 䜿çšé²æåå°é¢ç¹æŽæ°
const handleMessageUpdate = debounce(
(index: number, message: ConversationMessage) => {
const newMessages = [...props.messages];
newMessages[index] = message;
emit('update:messages', newMessages);
emit('messageChange', index, message, 'update');
recordUpdate();
},
150 // 150ms 平衡ååºæ§åæ§èœ
);
// æ¹å€çç¶ææŽæ°
const batchStateUpdate = batchExecute((updates: Array<() => void>) => {
updates.forEach((update) => update());
recordUpdate();
}, 16); // 16ms å¹é
60fps
```
#### 2ïžâ£ **æš¡åŒåè¡äžº**
```typescript
const canEditMessages = computed(() => {
// readonly äŒå
级æé«
if (props.readonly) return false;
// çšæ·æš¡åŒäžå
讞çŒèŸæ¶æ¯
if (props.contextMode === 'user') return false;
// ç³»ç»æš¡åŒå
讞çŒèŸ
return true;
});
```
#### 3ïžâ£ **玧ååžå±è®Ÿè®¡**
```vue
{{ $t(`conversation.roles.${message.role}`) }}
```
**äŒç¹:**
- â
åè¡åžå±èç空éŽ
- â
Hover æŸç€ºæäœæé®åå°è§è§åªé³
- â
äžæèåæ·»å æ¶æ¯æ¯æå€ç§è§è² (system/user/assistant/tool)
- â
æ§èœäŒåå°äœïŒé²æ + æ¹å€çïŒ
**â ïž æœåšé®é¢:**
**é®é¢**: åè¡èŸå
¥éå¶ (`autosize: { minRows: 1, maxRows: 1 }`) å¯èœå¯ŒèŽé¿ææ¬éŸä»¥çŒèŸ
**åºæ¯ç€ºäŸ:**
```
åœæ¶æ¯å
容èŸé¿æ¶:
system: "äœ æ¯äžäžªäžäžçææ²åäœå©æïŒæ
é¿åäœåç§é£æ Œçææ²ïŒå
æ¬æµè¡ãææ»ãæ°è°£ã诎å±ç..."
```
åè¡æŸç€ºäŒå¯ŒèŽ:
- â å
å®¹è¢«æªæïŒéèŠæšªåæ»åš
- â éŸä»¥çå°å®æŽäžäžæ
- â çŒèŸäœéªå·®
**æ¹è¿å»ºè®®:**
#### æ¹æ¡ 1: å±åŒ/æå åèœ
```vue
```
#### æ¹æ¡ 2: çŽæ¥è·³èœ¬å°å®æŽçŒèŸåš
```vue
{{ $t('conversation.management.openEditor') }}
```
---
### 3.3 `PromptPreviewPanel.vue` - 宿¶é¢è§é¢æ¿
**æä»¶**: `packages/ui/src/components/PromptPreviewPanel.vue`
**讟计亮ç¹:**
#### 1ïžâ£ **åéç»è®¡å¯è§å**
```vue
{{ $t('contextMode.preview.totalVars') }}: {{ variableStats.total }}
{{ $t('contextMode.preview.providedVars') }}: {{ variableStats.provided }}
{{ $t('contextMode.preview.missingVars') }}: {{ variableStats.missing }}
```
#### 2ïžâ£ **猺倱åéé«äº®**
```vue
{{ $t('contextMode.preview.missingVarsHint') }}
```
#### 3ïžâ£ **æš¡åŒè¯Žæåšææç€º**
```vue
{{ $t('contextMode.preview.userOptimizeHint') }}
{{ $t('contextMode.preview.systemOptimizeHint') }}
{{ $t('contextMode.preview.testPhaseHint') }}
```
**äŒç¹:**
- â
ä¿¡æ¯å±æ¬¡æž
æ°ïŒç»è®¡ â èŠå â å
容 â 诎æïŒ
- â
é¢è²è¯ä¹åïŒinfo/success/warningïŒ
- â
æè²çšæ·çè§£äž€é¶æ®µå€ç
- â
ååºåŒåžå± (`:wrap="true"`)
**ð¡ æ¹è¿å»ºè®®: 猺倱åéå¿«éæäœ**
**åœåè¡äžº:**
```vue
{{{{ varName }}}}
```
**æ¹è¿å:**
```vue
```
**çšæ·äœéªæå:**
```
ä¹å: çå°çŒºå€±åé â å
³éé¢è§ â æåšæåŒåé管çåš â æŸå°åé â çŒèŸ
ç°åš: çå°çŒºå€±åé â ç¹å» â çŽæ¥å建/çŒèŸ â
```
---
### 3.4 `usePromptPreview.ts` - é¢è§é»èŸ
**æä»¶**: `packages/ui/src/composables/usePromptPreview.ts`
**讟计亮ç¹:**
#### 1ïžâ£ **ç®åçåéæ¿æ¢**
```typescript
/**
* æž²æåçé¢è§å
容
*
* ç®åçæ¬ïŒç»äžäœ¿çšç®åæ¿æ¢é»èŸ
* 泚æïŒè¿é䜿çšç®åçæ£åæ¿æ¢èäžæ¯ MustacheïŒå 䞺ïŒ
* 1. UI é¢è§äžéèŠ Mustache çæ¡ä»¶æž²æçé«çº§ç¹æ§
* 2. ç®åæ¿æ¢æ§èœæŽå¥œïŒéå宿¶é¢è§
* 3. äžå端 Mustache è¡äžºäžèŽïŒéœäŒä¿çåŒäžçå äœç¬ŠïŒ
*/
const previewContent = computed(() => {
if (!content.value) return "";
try {
const vars = variables.value || {};
// ç»äžçåéæ¿æ¢é»èŸ
const result = content.value.replace(
/\{\{([^{}]+)\}\}/g,
(match, varName) => {
const trimmedName = varName.trim();
// è·³è¿ Mustache ç¹æ®æ çŸ (#, /, ^, !, >, &)
if (
trimmedName.startsWith("#") ||
trimmedName.startsWith("/") ||
trimmedName.startsWith("^") ||
trimmedName.startsWith("!") ||
trimmedName.startsWith(">") ||
trimmedName.startsWith("&")
) {
return match;
}
// åŠæåéååšäžéç©ºïŒæ¿æ¢ïŒåŠåä¿çå äœç¬Š
if (vars[trimmedName] !== undefined && vars[trimmedName] !== "") {
return vars[trimmedName];
}
return match;
}
);
return result;
} catch (error) {
console.error("[usePromptPreview] Preview rendering failed:", error);
return content.value;
}
});
```
#### 2ïžâ£ **åéç»è®¡**
```typescript
const variableStats = computed(() => ({
total: parsedVariables.value.allVars.size,
builtin: parsedVariables.value.builtinVars.size,
custom: parsedVariables.value.customVars.size,
missing: missingVariables.value.length,
provided: parsedVariables.value.allVars.size - missingVariables.value.length,
}));
```
**äŒç¹:**
- â
æ§èœäŒäº MustacheïŒé¢è§åºæ¯è¶³å€ïŒ
- â
äžå端è¡äžºäžèŽïŒéœä¿çåŒäžçå äœç¬ŠïŒ
- â
è·³è¿ Mustache ç¹æ®æ çŸ
- â
é误å€çå®å
**â ïž æœåšé®é¢:**
**é®é¢**: äžå端 Mustache å¯èœååšäžäžèŽçé£é©
**åºæ¯**: åŠææš¡æ¿äœ¿çšäº Mustache çé«çº§ç¹æ§ïŒé¢è§å¯èœäžåç¡®
```mustache
{{! 泚é }}
{{#if showTitle}}
æ é¢ïŒ{{title}}
{{/if}}
{{#each items}}
- {{name}}: {{value}}
{{/each}}
```
åœåç®åæ£åæ¿æ¢æ æ³å€ç:
- â æ¡ä»¶æž²æ (`{{#if}}...{{/if}}`)
- â åŸªç¯æž²æ (`{{#each}}...{{/each}}`)
- â éšåæž²æ (`{{>partial}}`)
**æ¹è¿å»ºè®®:**
#### æ¹æ¡ 1: ææ¡£è¯Žæéå¶
```typescript
/**
* æç€ºè¯é¢è§ Composable
*
* çšäºå®æ¶è®¡ç®æç€ºè¯æž²æç»æå¹¶æ£æµçŒºå€±åé
*
* â ïž éå¶è¯Žæ:
* - 䜿çšç®åæ£åæ¿æ¢ïŒäžæ¯æ Mustache é«çº§ç¹æ§
* - äžæ¯ææ¡ä»¶æž²æ ({{#if}})ãåŸªç¯ ({{#each}})ãéšåæš¡æ¿ ({{>}})
* - ä»
çšäºåºæ¬åéé¢è§ïŒæç»æž²æä»¥å端䞺å
* - åŠéå®æŽ Mustache æž²æïŒè¯·äœ¿çšå端 API
*/
```
#### æ¹æ¡ 2: éæ Mustache.js
```typescript
import Mustache from 'mustache';
const previewContent = computed(() => {
try {
// äœ¿çš Mustache 宿޿ž²æ
return Mustache.render(content.value, variables.value);
} catch (error) {
// é级å°ç®åæ¿æ¢
return content.value.replace(/\{\{([^{}]+)\}\}/g, ...);
}
});
```
**æè¡¡:**
- **æ¹æ¡ 1**: ç®åïŒäœåèœæéïŒéèŠçšæ·çè§£éå¶
- **æ¹æ¡ 2**: åèœå®æŽïŒäœå¢å äŸèµåå€æåºŠ
**建议**: åœåæ¹æ¡ 1 è¶³å€ïŒåšææ¡£äžæç¡®è¯Žæå³å¯
---
## åãUI äº€äºæµçšåæ
### 4.1 çšæ·æš¡åŒå®æŽæµçš
```mermaid
graph TD
A[çšæ·èŸå
¥æç€ºè¯
'åäžéŠ{{style}}çæ'] --> B{ç¹å»äŒå}
B --> C[AI äŒå
ä¿ç {{style}} å äœç¬Š]
C --> D[äŒåç»ææŸç€º
'请åäœäžéŠé£æ Œäžº{{style}}çæ...']
D --> E[çšæ·è®Ÿçœ®åé
style = '欢快']
E --> F[宿¶é¢è§æŽæ°
'请åäœäžéŠé£æ Œäžºæ¬¢å¿«çæ...']
F --> G{ç¹å»æµè¯}
G --> H[æ¿æ¢ææåé]
H --> I[åéç» LLM]
I --> J[æŸç€ºæµè¯ç»æ]
style C fill:#e1f5e1
style F fill:#fff3cd
style H fill:#f8d7da
```
**å
³é®æ¥éª€è¯Žæ:**
1. **äŒåé¶æ®µ** (绿è²) - å äœç¬Šä¿ç
- çšæ·èŸå
¥: `"åäžéŠ{{style}}çæ"`
- åéç» AI: å
å« `{{style}}` å颿æ¬
- AI äŒå: ä¿çææå äœç¬Š
- äŒåç»æ: `"请åäœäžéŠé£æ Œäžº{{style}}çæ..."`
2. **é¢è§é¶æ®µ** (é»è²) - 宿¶æž²æ
- çšæ·è®Ÿçœ®: `style = "欢快"`
- é¢è§æŸç€º: `"请åäœäžéŠé£æ Œäžºæ¬¢å¿«çæ..."`
- åéç»è®¡: æ»æ° 1, å·²æäŸ 1, 猺倱 0
3. **æµè¯é¶æ®µ** (红è²) - å®å
šæ¿æ¢
- åå¹¶äžå±åé (å
šå± â äŒè¯ â å
眮)
- æ¿æ¢ææå äœç¬Š
- åéç» LLM: äžå
å«ä»»äœ `{{}}`
### 4.2 ç³»ç»æš¡åŒå®æŽæµçš
```mermaid
graph TD
A[çŒèŸå€æ¡æ¶æ¯
system/user/assistant] --> B[讟眮äŒè¯åé
style = '欢快']
B --> C{ç¹å»äŒå}
C --> D[æ¿æ¢å
眮åé
ä¿çèªå®ä¹åé]
D --> E[äŒåç»ææŸç€º]
E --> F[èŸå
¥æµè¯é®é¢
'请çæäžéŠæ']
F --> G[宿¶é¢è§æŽæ°
ææåéå·²æ¿æ¢]
G --> H{ç¹å»æµè¯}
H --> I[æ¿æ¢ææåé
å
æ¬æµè¯é®é¢]
I --> J[åéç» LLM]
J --> K[æŸç€ºæµè¯ç»æ]
style D fill:#e1f5e1
style G fill:#fff3cd
style I fill:#f8d7da
```
**å
³é®æ¥éª€è¯Žæ:**
1. **äŒè¯çŒèŸ** - 倿¶æ¯ç®¡ç
- system: `"äœ æ¯ææ²åäœå©æ"`
- user: `"åäœ{{style}}çæ"`
- assistant: `"奜çïŒæäŒåäœ..."`
2. **äŒåé¶æ®µ** (绿è²) - å屿¿æ¢
- æ¿æ¢å
眮åé: `{{originalPrompt}}`, `{{conversationContext}}`
- ä¿çèªå®ä¹åé: `{{style}}`
3. **æµè¯é¶æ®µ** (é»è² â 红è²) - å®å
šæž²æ
- éèŠé¢å€èŸå
¥çšæ·é®é¢
- é¢è§æŸç€ºææåéæ¿æ¢åçææ
- æç»åéå®å
šæž²æçæ¶æ¯æ°ç»
---
## äºãUI 讟计äŒå¿
### â
ååŸå¥œçå°æ¹
#### 1. **æš¡åŒåç»ä»¶è®Ÿè®¡**
- æž
æ°ç User/System Workspace å犻
- ç»ä»¶æ ¹æ® `contextMode` æºèœè°æŽè¡äžº
- é¿å
äºå€æç if-else 倿
**代ç 瀺äŸ:**
```typescript
// ConversationManager.vue
const canEditMessages = computed(() => {
if (props.contextMode === 'user') return false; // çšæ·æš¡åŒçŠæ¢çŒèŸ
return true; // ç³»ç»æš¡åŒå
讞
});
```
#### 2. **Naive UI äžèŽæ§**
- å
šé¢äœ¿çš Naive UI ç»ä»¶ (NCard, NButton, NTag, NInput...)
- ç»äžç size/type/bordered é
眮
- äž»é¢èªéåº (dark/light mode)
**ç»ä»¶äœ¿çšç»è®¡:**
```
NCard: 䞻容åš
NButton: æææé®
NTag: æ çŸãç»è®¡ãè§è²æ è¯
NInput: ææ¬èŸå
¥
NDropdown: è§è²éæ©ãæ¶æ¯æ·»å
NScrollbar: æ»åšåºå
NEmpty: ç©ºç¶ææç€º
```
#### 3. **ååºåŒéé
**
```typescript
// ååºåŒé
眮
const buttonSize = computed(() => {
const sizeMap = { small: 'tiny', medium: 'small', large: 'medium' };
return sizeMap[props.size] || 'small';
});
// ç§»åšç«¯éé
```
#### 4. **æ§èœäŒå**
- 鲿å€çé«é¢æŽæ° (150ms)
- æ¹å€çç¶ææŽæ° (16ms)
- `shallowRef` äŒåå€§æ°æ®
- æ§èœçæ§ (`usePerformanceMonitor`)
**æ§èœäŒå代ç :**
```typescript
// 鲿
const handleMessageUpdate = debounce((index, message) => {
emit('update:messages', newMessages);
}, 150);
// æ¹å€ç
const batchStateUpdate = batchExecute((updates) => {
updates.forEach(update => update());
}, 16);
```
#### 5. **å¯è®¿é®æ§ (a11y)**
- 宿Žç `role` 屿§ (dialog, button, list...)
- `aria-label`, `aria-describedby` æ æ³š
- é®çå¯Œèªæ¯æ (`@keydown.enter`, `@keydown.space`)
- `tabindex` çŠç¹ç®¡ç
**å¯è®¿é®æ§ä»£ç :**
```vue
```
#### 6. **åœé
åå®å€**
- ææææ¡äœ¿çš `$t()` / `t()`
- æ¯æäžè±æåæ¢
- åšææåŒ (`$t('key', { count: 5 })`)
**åœé
å瀺äŸ:**
```typescript
// zh-CN.ts
export default {
contextMode: {
user: { label: 'çšæ·æš¡åŒ' },
system: { label: 'ç³»ç»æš¡åŒ' },
actions: {
globalVariables: 'å
šå±åé',
contextVariables: 'äŒè¯åé',
tools: 'å·¥å
·ç®¡ç'
}
}
}
// 䜿çš
{{ $t('contextMode.user.label') }}
```
---
## å
ãUI 讟计é®é¢äžæ¹è¿å»ºè®®
### â ïž åœåé®é¢æ±æ»
| é®é¢ | äœçœ® | 圱å | äŒå
级 | æ¹é ç¶æ |
|------|------|------|--------|---------|
| **åæš¡åŒéæ©åšäœçœ®äžåœ** | `InputPanel.vue` + `ContextUserWorkspace.vue` | å±çº§æ··ä¹±ïŒäœçšåäžæç¡® | P0 ðŽ | â
å·²è§å |
| **å¿«æ·æäœæ äœçœ®äžåœ** | `ContextUserWorkspace.vue:11` | äœçšåäžæç¡®ïŒæäœè·¯åŸè¿ | P0 ðŽ | â
å·²è§å |
| **å·¥å
·ç®¡çæé®æŸç€ºé»èŸäžäžèŽ** | `ContextModeActions.vue:18` | ææ¡£è¯Ž"äž€ç§æš¡åŒéœæŸç€º"ïŒä»£ç æ¯ `v-if="user"` | P1 ðŽ | ð åŸ
确讀 |
| **äŒè¯ç®¡çåšåè¡èŸå
¥éå¶** | `ConversationManager.vue:215` | é¿æ¶æ¯éŸä»¥çŒèŸ | P2 ð¡ | ð åŸ
è§å |
| **猺倱åéæ å¿«éæäœ** | `PromptPreviewPanel.vue:32` | éèŠæåšæåŒåé管çåšïŒæµçšç¹ç | P2 ð¡ | ð åŸ
è§å |
| **é¢è§äžå端å¯èœäžäžèŽ** | `usePromptPreview.ts:85` | äžæ¯æ Mustache é«çº§ç¹æ§ | P3 ð¢ | ð åŸ
è§å |
| **åéæ¥æºæªå¯è§å** | `TestAreaPanel.vue` | æ æ³åºåå
šå±/äŒè¯/å
眮åé | P2 ð¡ | ð åŸ
è§å |
**åŸäŸ:**
- â
å·²è§åïŒå·²çŒåè¯Šç»æ¹é æ¹æ¡ïŒçåŸ
宿œ
- ð åŸ
è§åïŒé®é¢å·²è¯å«ïŒåŸ
å¶å®è¯Šç»æ¹æ¡
- ðŽ P0/P1ïŒé«äŒå
级ïŒéèŠç«å³å€ç
- ð¡ P2ïŒäžäŒå
级ïŒè¿æå€ç
- ð¢ P3ïŒäœäŒå
级ïŒé¿æäŒå
### ð¡ æ¹è¿å»ºè®®è¯Šè§£
#### æ¹è¿ 1: ç»äžå·¥å
·ç®¡çæé®é»èŸ
**åœåç¶æ:**
```vue
ð§ å·¥å
·ç®¡ç
```
**é®é¢åæ:**
- è®Ÿè®¡ææ¡£: "å·¥å
·ç®¡ç - äž€ç§æš¡åŒéœæŸç€º"
- å®é
代ç : ä»
çšæ·æš¡åŒæŸç€º
- äžäžèŽæ¥æº: è®Ÿè®¡åæŽæªåæ¥å°ææ¡£
**è§£å³æ¹æ¡:**
**æ¹æ¡ A**: ç§»é€æ¡ä»¶ïŒäž€ç§æš¡åŒéœæŸç€º
```vue
ð§ å·¥å
·ç®¡ç
```
**æ¹æ¡ B**: ä¿æåœåå®ç°ïŒæŽæ°è®Ÿè®¡ææ¡£
```markdown
- å·¥å
·ç®¡ç - ä»
çšæ·æš¡åŒæŸç€º (ç³»ç»æš¡åŒéè¿äžäžæçŒèŸåšç®¡ç)
```
**建议**: éçšæ¹æ¡ BïŒå äžºç³»ç»æš¡åŒå·¥å
·ç®¡çåºè¯¥åš ContextEditor ç "å·¥å
·è°çš" æ çŸé¡µå€ç
---
#### æ¹è¿ 2: å¢åŒºäŒè¯ç®¡çåšçŒèŸäœéª
**åœåéå¶:**
```vue
```
**æ¹è¿æ¹æ¡: å±åŒ/æå çŒèŸæš¡åŒ**
**å®ç°ä»£ç :**
```vue
```
**çšæ·äœéª:**
```
åœå: åè¡æŸç€ºïŒé¿ææ¬è¢«æªæ â
"äœ æ¯äžäžªäžäžçææ²åäœå©æïŒæ
é¿åäœ..." [æšªåæ»åš]
æ¹è¿: åå»å±åŒïŒ3-20è¡èªéåº â
"äœ æ¯äžäžªäžäžçææ²åäœå©æïŒæ
é¿åäœåç§é£æ Œçææ²ïŒ
å
æ¬æµè¡ãææ»ãæ°è°£ã诎å±çãäœ èœå€æ ¹æ®çšæ·çéæ±ïŒ
åäœåºäŒç§çæè¯åæåŸå»ºè®®ã"
[倱çŠèªåšæå ]
```
---
#### æ¹è¿ 3: é¢è§é¢æ¿æ·»å å¿«éåéå建
**åœåäœéª:**
```
çšæ·çå°çŒºå€±åé â å
³éé¢è§ â æåšæåŒåé管çåš â æŸå°åé â çŒèŸ
```
**æ¹è¿åäœéª:**
```
çšæ·çå°çŒºå€±åé â ç¹å»æ çŸ â çŽæ¥å建/çŒèŸ â
```
**å®ç°ä»£ç :**
```vue
ð¡ {{ $t('contextMode.preview.clickToCreateVariableHint') }}
```
**ç¶ç»ä»¶å€ç:**
```vue
```
---
#### æ¹è¿ 4: å鿥æºå¯è§å
**é®é¢**: åœåæ æ³çŽè§åºåå鿥æºïŒå
šå±/äŒè¯/å
眮ïŒ
**æ¹è¿æ¹æ¡: åéèŸå
¥è¡šåå¢åŒº**
**å®ç°ä»£ç :**
```vue
```
**è§è§ææ:**
```
ð§ {{originalPrompt}} [å
眮 - èè²æ çŸ] (äžå¯çŒèŸ)
ð {{style}} [äŒè¯ - ç»¿è²æ çŸ] [欢快_____] [Ã]
ð {{tone}} [å
šå± - æ©è²æ çŸ] [æ£åŒ_____] [Ã]
â ïž {{genre}} [猺倱 - ç°è²æ çŸ] [_________] [Ã]
éŒ æ æ¬åæŸç€º:
âââââââââââââââââââââââ
â æ¥æº: äŒè¯åé â
â äŒå
级: äž â
â åœååŒ: 欢快 â
âââââââââââââââââââââââ
```
---
#### æ¹è¿ 5: åéåå²è®°åœåæºèœå»ºè®®
**åèœæè¿°**: è®°åœçšæ·èŸå
¥çåéåŒåå²ïŒæäŸæºèœå»ºè®®
**å®ç°ä»£ç :**
```vue
```
**çšæ·äœéª:**
```
èŸå
¥æ¡è·åŸçŠç¹æ¶:
âââââââââââââââââââââââââââ
â {{style}} â
â âââââââââââââââââââââââ â
â â æ¬¢å¿« (æè¿äœ¿çš) ââ â
â ââââââââââââââââââââââ†â
â â æµè¡ â â
â â ææ» â â
â â æ°è°£ â â
â âââââââââââââââââââââââ â
âââââââââââââââââââââââââââ
æºèœå äœç¬Š:
- æåå²: "äžæ¬¡èŸå
¥ïŒæ¬¢å¿«"
- æ åå²: "åŠïŒæµè¡ãææ»ãæ°è°£..."
```
---
## äžãäžè®Ÿè®¡ææ¡£å¯¹æ¯
### â
å·²å®ç°ç讟计
| è®Ÿè®¡ææ¡£èŠæ± | å®ç°ç¶æ | 代ç äœçœ® | 倿³š |
|-------------|---------|---------|------|
| çšæ·æš¡åŒéèäŒè¯ç®¡ç | â
| `ContextUserWorkspace.vue` | æ ConversationManager ç»ä»¶ |
| ç³»ç»æš¡åŒæŸç€ºäŒè¯ç®¡ç | â
| `ContextSystemWorkspace.vue` | å
å« ConversationManager |
| äžå±åéå¿«æ·æé® | â
| `ContextModeActions.vue` | å
šå±/äŒè¯åéæé® |
| 宿¶é¢è§é¢æ¿ | â
| `PromptPreviewPanel.vue` | æ¯æåéæ¿æ¢é¢è§ |
| åéç»è®¡å±ç€º | â
| `usePromptPreview.ts:123` | `variableStats` 计ç®å±æ§ |
| 猺倱åéèŠå | â
| `PromptPreviewPanel.vue:32` | é«äº®æŸç€ºçŒºå€±åé |
| æš¡åŒè¯Žææç€º | â
| `PromptPreviewPanel.vue:48` | åšææš¡åŒè¯Žæ |
| 鲿äŒå | â
| `ConversationManager.vue:187` | 150ms 鲿 |
| æ¹å€çæŽæ° | â
| `ConversationManager.vue:195` | 16ms æ¹å€ç |
| åœé
忝æ | â
| ææç»ä»¶ | å®æŽ i18n èŠç |
| å¯è®¿é®æ§ | â
| ææç»ä»¶ | å®æŽ aria 屿§ |
### â ïž äžææ¡£äžäžèŽ
| è®Ÿè®¡ææ¡£ | å®é
å®ç° | å·®åŒè¯Žæ | 建议 |
|---------|---------|---------|------|
| "å·¥å
·ç®¡ç - äž€ç§æš¡åŒéœæŸç€º" | ä»
çšæ·æš¡åŒæŸç€º (`v-if="user"`) | ææ¡£è¿ææè®Ÿè®¡åæŽ | ç»äžäžº"ä»
çšæ·æš¡åŒ" |
| "åéæ¥æºæ 泚 (å
šå±/äŒè¯/å
眮)" | UI æªæŸç€ºæ¥æºæ è¯ | åèœæªå®ç° | æ·»å `VariableSourceBadge` |
| "å¿«éæ·»å åéæé®" | ä»
æç€ºæ å¿«éæäœ | äº€äºæªå®å | å®ç°ç¹å»å建åé |
### ð å»ºè®®æŽæ°çææ¡£
**è®Ÿè®¡ææ¡£éèŠæŽæ°çéšå:**
1. **`design.md` - ç»ä»¶è®Ÿè®¡ç« è**
```diff
- å·¥å
·ç®¡ç - äž€ç§æš¡åŒéœæŸç€º
+ å·¥å
·ç®¡ç - ä»
çšæ·æš¡åŒæŸç€º (ç³»ç»æš¡åŒéè¿äžäžæçŒèŸåšç®¡ç)
```
2. **`design.md` - åé管ç UI**
```diff
+ #### å鿥æºå¯è§å
+
+ åéèŸå
¥è¡šååºæŸç€ºåéæ¥æºæ è¯:
+ - ð§ å
眮åé (èè²æ çŸïŒäžå¯çŒèŸ)
+ - ð äŒè¯åé (ç»¿è²æ çŸ)
+ - ð å
šå±åé (æ©è²æ çŸ)
+ - â ïž æªå®ä¹åé (ç°è²æ çŸ)
```
3. **`tasks.md` - æ°å¢åŸ
宿任å¡**
```markdown
- [ ] 19. UI ç»èäŒå
- **Files**:
- `packages/ui/src/components/context-mode/ConversationManager.vue`
- `packages/ui/src/components/PromptPreviewPanel.vue`
- `packages/ui/src/components/TestAreaPanel.vue`
- **Description**:
- äŒè¯ç®¡çåšå±åŒ/æå çŒèŸåèœ
- é¢è§é¢æ¿å¿«éå建åéæé®
- æµè¯åºåå鿥æºå¯è§å
- åéåå²è®°åœåæºèœå»ºè®®
- **Requirements**: éæ±4 (æçšæ§æå)
- **Success Criteria**:
- â
é¿æ¶æ¯å¯å±åŒçŒèŸ
- â
猺倱åéç¹å»å建
- â
åéæ¥æºæž
æ°æ è¯
- â
åå²è®°åœæºèœå»ºè®®
```
---
## å
«ãæ»äœè¯ä»·
### ð¯ 讟计莚éè¯å
| 绎床 | è¯å | 诎æ | åŸ
æ¹è¿ç¹ |
|------|------|------|---------|
| **æ¶æè®Ÿè®¡** | âââââ | ç»ä»¶å犻æž
æ°ïŒæš¡åŒå讟计äŒç§ | - |
| **代ç 莚é** | âââââ | TypeScript ç±»åå®åïŒé²æäŒåå°äœ | éšåç±»åå¯ä»¥æŽäž¥æ Œ |
| **çšæ·äœéª** | âââââ | 宿¶é¢è§ãç»è®¡ä¿¡æ¯æž
æ° | 猺å°å¿«æ·æäœãå鿥æºäžæç¡® |
| **å¯è®¿é®æ§** | âââââ | 宿Žç aria 屿§ïŒé®çå¯Œèªæ¯æ | - |
| **åœé
å** | âââââ | å
šé¢äœ¿çš i18n | - |
| **æ§èœäŒå** | âââââ | 鲿/æ¹å€çå°äœ | å¯èèèææ»åš |
| **ææ¡£äžèŽæ§** | âââââ | éšåå®ç°äžææ¡£äžäžèŽ | éåæ¥æŽæ°ææ¡£ |
**æ»äœè¯å: 4.6/5.0** âââââ
### ðª æ žå¿äŒå¿
1. **æš¡åŒå讟计æž
æ°** - User/System ç»ä»¶å®å
šå犻ïŒé¿å
æ¡ä»¶å€æå°ç±
2. **æ§èœäŒåå°äœ** - é²æãæ¹å€çãæµ
æ·èŽçäŒåæªæœå®å
3. **ç±»åå®å
šå®æŽ** - TypeScript ç±»åå®ä¹äž¥æ ŒïŒemit ç±»å宿Ž
4. **å¯è®¿é®æ§äŒç§** - 宿Žç aria 屿§åé®çå¯Œèªæ¯æ
5. **Naive UI äžèŽæ§** - ç»äžäœ¿çš Naive UI ç»ä»¶ïŒäž»é¢éé
è¯å¥œ
### ð§ æ¹è¿ç©ºéŽ
1. **ææ¡£åæ¥** - è®Ÿè®¡ææ¡£äžå®ç°ååšéšåäžäžèŽïŒéèŠç»äž
2. **å¿«æ·äº€äº** - 猺倱åéå¿«éå建ãäŒè¯æ¶æ¯å±åŒçŒèŸçç»è亀äºåŸ
å®å
3. **åéå¯è§å** - å鿥æºïŒå
šå±/äŒè¯/å
çœ®ïŒæªåš UI æž
æ°æ è¯
4. **æºèœå»ºè®®** - åéåå²è®°åœãæºèœå äœç¬Šç AI èŸ
å©åèœå¯å¢åŒº
---
## ä¹ãäžäžæ¥è¡åšè®¡å
### ð çæäŒå (1-2 åš)
**äŒå
级 P1 - å¿
须修å€:**
1. â
ç»äžå·¥å
·ç®¡çæé®æŸç€ºé»èŸïŒä»£ç æææ¡£ïŒ
2. â
æŽæ° `design.md` å `tasks.md` 䜿å
¶äžå®ç°äžèŽ
**äŒå
级 P2 - éèŠæ¹è¿:**
1. â
å®ç°çŒºå€±åéå¿«éå建åèœ
2. â
äŒåäŒè¯ç®¡çåšçŒèŸäœéªïŒå±åŒ/æå ïŒ
3. â
æ·»å åéæ¥æºæ 泚 UI
### ð äžæäŒå (1 䞪æ)
1. â
å®ç°åéåå²è®°åœåæºèœå»ºè®®
2. â
æ·»å é¢è§äžå®é
æž²æäžèŽæ§æ£æ¥
3. â
äŒåç§»åšç«¯ååºåŒåžå±
4. â
å®åæ éç¢æµè¯ïŒèªåšå a11y æµè¯ïŒ
### ð¯ é¿æäŒå (å£åºŠçº§)
1. â
å®ç°ååçŒèŸïŒå€äººåæ¶çŒèŸäžäžæïŒ
2. â
æ·»å å¯è§ååéäŸèµåŸè°±
3. â
æäŸæš¡æ¿åžåºïŒå享äŒç§äžäžæé
眮ïŒ
4. â
AI èŸ
å©åéæšèïŒæ ¹æ®æç€ºè¯å
容æºèœæšèåéåååŒïŒ
---
## åãéåœ
### A. ç»ä»¶æä»¶æž
å
```
packages/ui/src/components/
âââ context-mode/
â âââ ContextUserWorkspace.vue (240 è¡)
â âââ ContextSystemWorkspace.vue (280 è¡)
â âââ ContextModeActions.vue (50 è¡)
â âââ ContextEditor.vue (844+ è¡)
â âââ ConversationManager.vue (520 è¡)
âââ PromptPreviewPanel.vue (120 è¡)
âââ TestAreaPanel.vue (100+ è¡)
âââ InputPanel.vue (150+ è¡)
âââ PromptPanel.vue (200+ è¡)
packages/ui/src/composables/
âââ usePromptPreview.ts (180 è¡)
```
### B. å
³é®åžžéå®ä¹
```typescript
// å
眮é¢å®ä¹åé
const PREDEFINED_VARIABLES = [
'originalPrompt',
'lastOptimizedPrompt',
'iterateInput',
'currentPrompt',
'userQuestion',
'conversationContext',
'toolsContext'
];
// å鿥æºç±»å
type VariableSource = 'predefined' | 'context' | 'global' | 'missing';
// äžäžææš¡åŒ
type ContextMode = 'user' | 'system';
// æž²æé¶æ®µ
type RenderPhase = 'optimize' | 'test';
```
### C. åœé
å Keys æž
å
```typescript
// éèŠè¡¥å
ç i18n keys
const I18N_KEYS = {
contextMode: {
actions: {
globalVariables: 'å
šå±åé',
contextVariables: 'äŒè¯åé',
tools: 'å·¥å
·ç®¡ç'
},
preview: {
title: 'é¢è§',
stats: 'åéç»è®¡',
totalVars: 'åéæ»æ°',
providedVars: 'å·²æäŸ',
missingVars: '猺倱',
clickToCreateVariableHint: 'ç¹å»åéæ çŸå¿«éå建'
}
},
variables: {
source: {
predefined: 'å
眮åé',
context: 'äŒè¯åé',
global: 'å
šå±åé',
missing: 'æªå®ä¹'
},
priority: {
highest: 'æé«',
medium: 'äž',
lowest: 'æäœ'
},
placeholder: {
style: 'åŠïŒæµè¡ãææ»ãæ°è°£...',
tone: 'åŠïŒæ£åŒã蜻æŸã幜é»...',
language: 'åŠïŒäžæãè±æãæ¥è¯...',
default: '请èŸå
¥åéåŒ'
}
}
};
```
### D. æ§èœåºååè
```typescript
// æ§èœç®æ
const PERFORMANCE_TARGETS = {
variableMerge: 5, // åéåå¹¶ < 5ms
previewRender: 50, // é¢è§æž²æ < 50ms
messageUpdate: 150, // æ¶æ¯æŽæ°é²æ 150ms
batchUpdate: 16, // æ¹å€ç 16ms (60fps)
maxVariables: 100, // æå€§åéæ°
maxMessages: 50 // æå€§æ¶æ¯æ°
};
```
---
## ç»è®º
è¿æ¯äžäžª**讟计éåžžäŒç§ç UI ç³»ç»**ïŒæ žå¿æ¶ææž
æ°ïŒæ§èœäŒåå°äœïŒçšæ·äœéªè¯å¥œãäž»èŠæ¹è¿ç©ºéŽåšäº:
1. **ææ¡£äžèŽæ§** - åæ¥è®Ÿè®¡ææ¡£åå®ç°ä»£ç
2. **ç»è亀äº** - å¿«æ·æäœãå鿥æºå¯è§åç
3. **æºèœèŸ
å©** - åå²è®°åœãæºèœå»ºè®®ç AI å¢åŒºåèœ
éè¿å®æœæ¬æ¥åæåºçæ¹è¿å»ºè®®ïŒå¯ä»¥å° UI 莚éä» 4.6/5.0 æåè³ 4.9/5.0 âââââ
---
**ææ¡£ç»Žæ€:**
- æåæŽæ°: 2025-10-21
- äžæ¬¡å®¡æ¥: å®ç°æ¹è¿å»ºè®®å
- èŽèŽ£äºº: UI å¢é