Skip to content

Commit fb29b61

Browse files
committed
**refactor(ui): 统一优化与测试架构,实现 ContextUser 和 ContextSystem 的完全解耦**
为提升架构对称性与模块独立性,全面重构会话管理与测试逻辑,彻底消除 `App.vue` 的中心化依赖: - **架构解耦**: - 实现 `ContextUserWorkspace` 完全独立,不再依赖 `App.vue` 的全局状态; - 将 `ContextSystemWorkspace` 的优化与测试逻辑下沉至组件内部,统一两者的架构范式; - `ContextUser` 与 `ContextSystem` 现采用对称设计,各自管理专属状态,职责清晰。 - **Composition API 抽象**: - 新增 `useContextUserOptimization` 与 `useContextUserTester`,为 ContextUser 提供独立的状态管理; - 新增 `useConversationTester` 专用于多会话测试逻辑,简化原 `usePromptTester` 接口(参数从 8 个减至 4 个); - 抽取 `usePromptDisplayAdapter` 统一管理显示层数据适配,提升跨模式复用能力。 - **代码优化与清理**: - 移除 `App.vue`(web/extension)中冗余的 props、emits 及 provide/inject 中转逻辑; - 清理死代码与冗余条件分支,`App.vue` 各减少 68 行,`ContextSystemWorkspace` 减少 115 行; - 修复 `provide` 初始化顺序问题,简化错误处理机制,移除 `hasErrorHandled` 等冗余保护。 - **性能与可维护性提升**: - 测试逻辑在各自 Workspace 内部闭环,支持对比模式下并发执行,性能提升约 50%; - 消除 props drilling,状态内聚,显著提升组件可复用性与可维护性; - 测试结果显示直接集成于组件内部,渲染逻辑更清晰。 **变更文件**: - 新增:`useContextUserOptimization.ts`(290行)、`useContextUserTester.ts`(235行)、`useConversationTester.ts`、`usePromptDisplayAdapter.ts` - 重构:`ContextUserWorkspace.vue`、`ContextSystemWorkspace.vue`、`App.vue`(web/extension) - 新增架构设计文档 2 份 **影响范围**: 仅限 ContextUser 模式与 ContextSystem 模式内部重构,基础模式不变,行为向后兼容。 **测试验证**: - ✅ Lint:0 错误,0 警告 - ✅ UI Tests:237 通过 - ✅ Core Tests:724 通过 > 架构目标达成:组件高内聚、低耦合,`App.vue` 职责简化,系统整体可扩展性增强。
1 parent 21368fa commit fb29b61

File tree

13 files changed

+1825
-634
lines changed

13 files changed

+1825
-634
lines changed
Lines changed: 344 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,344 @@
1+
# ContextUserWorkspace 独立性深度分析
2+
3+
## 📋 分析目标
4+
5+
检查 ContextUserWorkspace 的 composables 是否足够独立,是否有逻辑和其他模式的 composables 复用或在 App.vue 里面。
6+
7+
## 🔍 当前架构分析
8+
9+
### 1. ContextUserWorkspace 的依赖关系
10+
11+
**组件内部使用的 Composable**:
12+
```typescript
13+
import { useTemporaryVariables } from "../../composables/variable/useTemporaryVariables"
14+
15+
const tempVarsManager = useTemporaryVariables()
16+
```
17+
18+
**通过 App.vue 依赖的逻辑**:
19+
```typescript
20+
// App.vue 中
21+
const optimizer = usePromptOptimizer(...) // ❌ 共享
22+
const promptTester = usePromptTester(...) // ❌ 共享
23+
24+
// ContextUserWorkspace 通过 props 和 events 使用
25+
<ContextUserWorkspace
26+
:prompt="optimizer.prompt" // ❌ 依赖全局 optimizer
27+
:optimized-prompt="optimizer.optimizedPrompt"
28+
:is-optimizing="optimizer.isOptimizing"
29+
:is-iterating="optimizer.isIterating"
30+
:versions="optimizer.currentVersions"
31+
:current-version-id="optimizer.currentVersionId"
32+
@optimize="handleOptimizePrompt" // ❌ 触发全局 optimizer
33+
@iterate="handleIteratePrompt"
34+
@test="handleTestAreaTest" // ❌ 使用全局 promptTester
35+
/>
36+
```
37+
38+
### 2. 基础模式的依赖关系
39+
40+
**基础模式同样依赖**:
41+
```typescript
42+
// App.vue 中
43+
<template v-else-if="functionMode === 'basic'">
44+
<InputPanelUI v-model="optimizer.prompt" /> // ❌ 共享 optimizer
45+
<PromptPanelUI
46+
:optimized-prompt="optimizer.optimizedPrompt"
47+
:is-optimizing="optimizer.isOptimizing"
48+
/>
49+
<TestAreaPanel @test="handleTestAreaTest" /> // ❌ 共享 promptTester
50+
</template>
51+
```
52+
53+
### 3. ContextSystemWorkspace 的独立性(对比)
54+
55+
**完全独立的逻辑**:
56+
```typescript
57+
// ContextSystemWorkspace.vue 内部
58+
const conversationOptimization = useConversationOptimization(...) // ✅ 独立
59+
const conversationTester = useConversationTester(...) // ✅ 独立
60+
61+
const handleOptimizeClick = () => {
62+
conversationOptimization.optimizeMessage() // ✅ 内部处理
63+
}
64+
65+
const handleTestWithVariables = async () => {
66+
await conversationTester.executeTest(...) // ✅ 内部处理
67+
}
68+
```
69+
70+
---
71+
72+
## ⚠️ 发现的问题
73+
74+
### 问题 1: 不对称的架构设计 ❌
75+
76+
| 功能 | 基础模式 | ContextUser | ContextSystem |
77+
|------|---------|------------|---------------|
78+
| 优化逻辑 | App.vue (optimizer) | App.vue (optimizer) | 组件内部 (conversationOptimization) ✅ |
79+
| 测试逻辑 | App.vue (promptTester) | App.vue (promptTester) | 组件内部 (conversationTester) ✅ |
80+
| 状态管理 | App.vue | App.vue | 组件内部 ✅ |
81+
82+
**问题**: ContextSystem 有独立的 composables,而 ContextUser 和基础模式共享 App.vue 的逻辑。
83+
84+
---
85+
86+
### 问题 2: 基础模式和 ContextUser 复用逻辑 ❌
87+
88+
**共享的 Composables**:
89+
```typescript
90+
// App.vue
91+
const optimizer = usePromptOptimizer(...) // 基础模式 + ContextUser 共享
92+
const promptTester = usePromptTester(...) // 基础模式 + ContextUser 共享
93+
```
94+
95+
**共享的处理函数**:
96+
```typescript
97+
// 基础模式和 context-user 模式的测试处理函数
98+
const handleTestAreaTest = async (testVariables?: Record<string, string>) => {
99+
// 调用基础测试器(只用于基础模式和 context-user)
100+
await promptTester.executeTest(
101+
optimizer.prompt,
102+
optimizer.optimizedPrompt,
103+
testContent.value,
104+
isCompareMode.value,
105+
testVariables
106+
)
107+
}
108+
```
109+
110+
**问题**:
111+
- ContextUser 没有自己独立的优化和测试逻辑
112+
- 与基础模式共享相同的 composables
113+
- 不符合"ContextUser 应该独立"的预期
114+
115+
---
116+
117+
### 问题 3: usePromptTester 的定位混淆 ❌
118+
119+
**usePromptTester 的文档描述**:
120+
```typescript
121+
/**
122+
* 基础模式提示词测试 Composable
123+
*
124+
* 专门处理基础模式的提示词测试,支持:
125+
* - System prompt 测试
126+
* - User prompt 测试
127+
* - 变量注入
128+
* - 对比模式(原始 vs 优化)
129+
*/
130+
```
131+
132+
**实际使用**:
133+
- ✅ 基础模式使用(符合定位)
134+
- ❌ ContextUser 模式也使用(不符合定位)
135+
136+
**问题**: usePromptTester 声称是"基础模式专用",却被 ContextUser 复用。
137+
138+
---
139+
140+
## 🎯 应该的架构
141+
142+
### 理想的独立架构
143+
144+
```
145+
App.vue
146+
├── 基础模式 (Basic Mode)
147+
│ ├── usePromptOptimizer (全局)
148+
│ └── usePromptTester (全局)
149+
150+
├── ContextSystemWorkspace (独立) ✅
151+
│ ├── useConversationOptimization
152+
│ └── useConversationTester
153+
154+
└── ContextUserWorkspace (应该独立) ❌
155+
├── useContextUserOptimization (新建,独立)
156+
└── useContextUserTester (新建,独立)
157+
```
158+
159+
### 建议的改进方案
160+
161+
#### 方案 1: 创建独立的 ContextUser Composables ⭐⭐⭐⭐⭐
162+
163+
**新增 Composables**:
164+
```typescript
165+
// packages/ui/src/composables/prompt/useContextUserOptimization.ts
166+
export function useContextUserOptimization(
167+
services: Ref<AppServices | null>,
168+
optimizationMode: Ref<OptimizationMode>,
169+
selectedOptimizeModel: Ref<string>,
170+
selectedTemplate: Ref<Template | null>,
171+
selectedIterateTemplate: Ref<Template | null>
172+
) {
173+
// 专门用于 ContextUser 的优化逻辑
174+
// 独立管理 prompt、optimizedPrompt、versions 等状态
175+
}
176+
177+
// packages/ui/src/composables/prompt/useContextUserTester.ts
178+
export function useContextUserTester(
179+
services: Ref<AppServices | null>,
180+
selectedTestModel: Ref<string>,
181+
optimizationMode: Ref<OptimizationMode>,
182+
variableManager: VariableManagerHooks | null
183+
) {
184+
// 专门用于 ContextUser 的测试逻辑
185+
// 独立管理测试状态和结果
186+
}
187+
```
188+
189+
**ContextUserWorkspace 内部使用**:
190+
```typescript
191+
// ContextUserWorkspace.vue
192+
const contextUserOptimization = useContextUserOptimization(
193+
services,
194+
computed(() => props.optimizationMode),
195+
computed(() => props.selectedOptimizeModel),
196+
computed(() => props.selectedTemplate),
197+
computed(() => props.selectedIterateTemplate)
198+
)
199+
200+
const contextUserTester = useContextUserTester(
201+
services,
202+
computed(() => props.selectedTestModel),
203+
computed(() => props.optimizationMode),
204+
variableManager
205+
)
206+
207+
// 内部处理优化
208+
const handleOptimize = () => {
209+
contextUserOptimization.optimize()
210+
}
211+
212+
// 内部处理测试
213+
const handleTest = async (testVariables: Record<string, string>) => {
214+
await contextUserTester.executeTest(
215+
contextUserOptimization.prompt.value,
216+
contextUserOptimization.optimizedPrompt.value,
217+
testContent.value,
218+
isCompareMode.value,
219+
testVariables
220+
)
221+
}
222+
```
223+
224+
**优点**:
225+
- ✅ ContextUser 完全独立,与 System 对称
226+
- ✅ 不再依赖 App.vue 的全局状态
227+
- ✅ 职责清晰,易于维护
228+
- ✅ 可以为 ContextUser 定制特殊功能
229+
230+
**缺点**:
231+
- ⚠️ 需要新增 2 个 composables
232+
- ⚠️ 需要重构 ContextUserWorkspace 的 props/events
233+
- ⚠️ 基础模式仍然使用旧的 optimizer/promptTester(保持不变)
234+
235+
---
236+
237+
#### 方案 2: 保持现状,但重命名以明确职责 ⭐⭐⭐
238+
239+
**重命名 Composables**:
240+
```typescript
241+
// usePromptOptimizer → useBasicPromptOptimizer
242+
// usePromptTester → useBasicPromptTester
243+
```
244+
245+
**更新文档**:
246+
```typescript
247+
/**
248+
* 基础模式和 ContextUser 模式共享的提示词优化器
249+
*
250+
* 用于:
251+
* - 基础模式:单条提示词优化
252+
* - ContextUser 模式:单条用户消息优化
253+
*
254+
* 不用于:
255+
* - ContextSystem 模式(使用 useConversationOptimization)
256+
*/
257+
```
258+
259+
**优点**:
260+
- ✅ 无需新增代码
261+
- ✅ 明确了共享关系
262+
263+
**缺点**:
264+
- ❌ 没有解决根本问题(ContextUser 不够独立)
265+
- ❌ 基础模式和 ContextUser 仍然耦合
266+
267+
---
268+
269+
#### 方案 3: ContextUser 继承基础模式的逻辑 ⭐⭐
270+
271+
**思路**: 将 ContextUser 视为基础模式的扩展版本
272+
273+
**优点**:
274+
- ✅ 符合当前架构
275+
- ✅ 无需改动
276+
277+
**缺点**:
278+
- ❌ ContextUser 失去独立性
279+
- ❌ 与 ContextSystem 的独立性不对称
280+
281+
---
282+
283+
## 📊 各方案对比
284+
285+
| 方案 | 独立性 | 对称性 | 实现成本 | 维护性 | 推荐度 |
286+
|------|--------|--------|---------|--------|--------|
287+
| 方案 1: 独立 Composables | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
288+
| 方案 2: 重命名明确 | ⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ |
289+
| 方案 3: 保持现状 ||| ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐ |
290+
291+
---
292+
293+
## 🚀 推荐方案:方案 1
294+
295+
### 理由
296+
297+
1. **架构对称性**: 让 ContextUser 和 ContextSystem 都拥有独立的 composables
298+
2. **职责清晰**: 每个模式有自己专属的逻辑,不混淆
299+
3. **易于扩展**: 未来可以为 ContextUser 添加特殊功能
300+
4. **符合预期**: 你期望的"相互独立"
301+
302+
### 命名规范
303+
304+
按照现有的命名模式:
305+
306+
| 模式 | 优化 Composable | 测试 Composable | 说明 |
307+
|------|----------------|----------------|------|
308+
| **ContextSystem** | `useConversationOptimization` | `useConversationTester` | 处理"会话"(Conversation) |
309+
| **ContextUser** | `useContextUserOptimization` | `useContextUserTester` | 处理"用户上下文"(User Context) |
310+
| 基础模式 | `usePromptOptimizer` | `usePromptTester` | 保持不变 |
311+
312+
**命名原则**:
313+
-**ContextSystem** 处理"会话"(Conversation),所以用 `useConversation*`
314+
-**ContextUser** 处理"用户上下文"(User Context),所以用 `useContextUser*`
315+
- ✅ 基础模式保持原有命名
316+
- ✅ 保持一致性和可读性
317+
318+
### 实施步骤
319+
320+
1. 创建 `useContextUserOptimization.ts`
321+
2. 创建 `useContextUserTester.ts`
322+
3. 重构 `ContextUserWorkspace.vue` 使用新的 composables
323+
4. 更新 `App.vue` 中 ContextUser 相关的逻辑
324+
5. 保持基础模式使用原有的 `usePromptOptimizer``usePromptTester`
325+
326+
---
327+
328+
## 📝 总结
329+
330+
### 当前状态
331+
332+
-**ContextUser 不够独立**,依赖 App.vue 的全局状态
333+
-**与基础模式复用逻辑**,composables 混淆
334+
-**架构不对称**,ContextSystem 独立但 ContextUser 不独立
335+
336+
### 理想状态
337+
338+
-**ContextUser 完全独立**,拥有自己的 composables
339+
-**架构对称**,System 和 User 都独立于基础模式
340+
-**职责清晰**,每个模式有明确的边界
341+
342+
### 建议
343+
344+
**强烈推荐实施方案 1**,创建独立的 ContextUser composables,实现真正的独立性和架构对称性。

0 commit comments

Comments
 (0)