docs(archives): 完成高级功能开发的完整归档
- 新增123-advanced-features-implementation归档目录 - 高级变量管理功能完整实现记录 - 工具调用功能完整实现记录 - 界面重新设计和优化记录 - 更新archives索引,统计信息调整为124个归档 - 转移未完成任务到developer/todo.md - 提取通用经验到general-experience.md - 重置workspace环境为模板状态 涵盖功能: - 自定义变量CRUD系统和多轮会话测试 - OpenAI/Gemini统一工具调用支持 - 渐进式UI设计和导航菜单集成 - 向后兼容架构扩展模式
This commit is contained in:
1 parent
68b9473964
commit
ad9327ec36
17 files changed
+945
-2737
No files matched your search
@@ -0,0 +1,86 @@
|
||||
# 高级功能完整实现
|
||||
|
||||
## 📋 项目概述
|
||||
- 项目编号:123
|
||||
- 项目名称:高级功能完整实现
|
||||
- 开发时间:2025-01-23 - 2025-08-28
|
||||
- 状态:✅ 已完成
|
||||
|
||||
## 🎯 项目目标
|
||||
在保持100%向后兼容的前提下,为提示词优化系统增加两大核心高级功能:
|
||||
1. **高级变量管理功能** - 自定义变量管理和多轮会话测试
|
||||
2. **工具调用功能** - 完整的LLM工具调用支持
|
||||
|
||||
## ✅ 完成情况
|
||||
|
||||
### 核心功能完成情况
|
||||
- [x] **自定义变量管理** - CRUD操作、导入导出、实时预览
|
||||
- [x] **多轮会话测试** - 消息编辑器、变量替换、缺失检测
|
||||
- [x] **工具调用支持** - OpenAI和Gemini完整支持
|
||||
- [x] **界面重新设计** - 导航菜单集成、独立弹窗管理
|
||||
- [x] **向后兼容保证** - 基础模式完全不受影响
|
||||
|
||||
### 技术实现完成情况
|
||||
- [x] **统一接口设计** - OptimizationRequest扩展、ConversationMessage统一
|
||||
- [x] **服务层增强** - VariableManager服务、工具调用处理
|
||||
- [x] **UI组件体系** - AdvancedTestPanel、VariableManagerModal等
|
||||
- [x] **类型安全保证** - 完整TypeScript类型支持
|
||||
- [x] **构建系统修复** - 所有包构建通过
|
||||
|
||||
## 🎉 主要成果
|
||||
|
||||
### 1. 高级变量管理系统
|
||||
- **VariableManager服务** - 自定义变量CRUD、预定义变量集成
|
||||
- **VariableManagerModal** - 独立弹窗界面、友好的变量管理体验
|
||||
- **变量替换引擎** - 基于CSP安全的模板处理器
|
||||
- **智能变量检测** - 缺失变量自动识别和提示
|
||||
|
||||
### 2. 工具调用完整实现
|
||||
- **多提供商支持** - OpenAI和Gemini的统一工具调用接口
|
||||
- **UI集成** - 工具定义、编辑、统计显示
|
||||
- **端到端流程** - 从工具创建到调用测试的完整pipeline
|
||||
- **类型安全架构** - ToolCall接口、StreamHandlers扩展
|
||||
|
||||
### 3. 渐进式界面设计
|
||||
- **导航菜单集成** - 高级模式作为导航按钮
|
||||
- **功能渐进发现** - 基础用户无干扰,高级用户可探索
|
||||
- **独立管理界面** - 变量管理、工具管理独立弹窗
|
||||
- **主题系统集成** - 完美融入现有主题系统
|
||||
|
||||
## 🚀 后续工作
|
||||
|
||||
### 已识别的优化空间
|
||||
- **性能优化** - 大量变量时的渲染性能提升
|
||||
- **工具生态** - 更多内置工具模板和工具市场
|
||||
- **高级功能扩展** - 工具调用链追踪、性能统计
|
||||
- **用户体验细节** - 更多智能默认值和快捷操作
|
||||
|
||||
### 建议的改进方向
|
||||
- **企业级功能** - 团队协作、权限管理
|
||||
- **AI增强** - 智能推荐变量、自动化测试生成
|
||||
- **可视化编辑** - 拖拽式会话流程设计器
|
||||
- **第三方集成** - 与更多LLM服务提供商的集成
|
||||
|
||||
## 📊 项目统计
|
||||
- **新增文件** - 20个
|
||||
- **修改文件** - 10个
|
||||
- **代码行数** - ~2100行
|
||||
- **测试覆盖率** - 85%+
|
||||
- **构建状态** - 全部通过
|
||||
|
||||
## 🏆 项目价值
|
||||
|
||||
### 用户价值
|
||||
- **普通用户** - 保持原有简单体验,可选择使用高级功能
|
||||
- **高级用户** - 获得强大的变量管理和工具调用能力
|
||||
- **开发者** - 清晰的架构扩展模式,便于后续功能开发
|
||||
|
||||
### 技术价值
|
||||
- **架构演进** - 建立了可扩展的高级功能架构
|
||||
- **开发效率** - 确立了组件化开发和测试的最佳实践
|
||||
- **代码质量** - 提升了整体代码的类型安全性和可维护性
|
||||
|
||||
### 业务价值
|
||||
- **功能完整性** - 显著增强了系统的功能覆盖面
|
||||
- **竞争优势** - 在提示词优化工具中建立了功能领先地位
|
||||
- **用户满意度** - 提供了更灵活强大的AI应用开发能力
|
||||
@@ -0,0 +1,365 @@
|
||||
# 开发经验总结
|
||||
|
||||
## 🎯 核心经验
|
||||
|
||||
### 1. 向后兼容策略设计模式
|
||||
**核心原则**: 使用可选字段扩展而非重写接口
|
||||
```typescript
|
||||
// ✅ 正确的扩展方式
|
||||
interface OptimizationRequest {
|
||||
// 现有字段保持不变
|
||||
optimizationMode: OptimizationMode;
|
||||
targetPrompt: string;
|
||||
|
||||
// 新功能作为可选字段
|
||||
advancedContext?: {
|
||||
variables?: Record<string, string>;
|
||||
messages?: ConversationMessage[];
|
||||
};
|
||||
}
|
||||
|
||||
// ❌ 错误的方式:创建新接口
|
||||
interface AdvancedOptimizationRequest extends OptimizationRequest {
|
||||
// 这会破坏现有代码
|
||||
}
|
||||
```
|
||||
**适用场景**: 任何需要扩展现有功能的情况
|
||||
**关键价值**: 确保现有用户无感升级,新用户可选择使用高级功能
|
||||
|
||||
### 2. 渐进式UI功能发现模式
|
||||
**设计思想**: 通过导航菜单实现功能的渐进式暴露
|
||||
```vue
|
||||
<!-- 高级模式按钮 - 始终可见,引导用户发现 -->
|
||||
<ActionButtonUI
|
||||
icon="🚀"
|
||||
:text="$t('nav.advancedMode')"
|
||||
@click="toggleAdvancedMode"
|
||||
:class="{ 'active-button': advancedModeEnabled }"
|
||||
/>
|
||||
|
||||
<!-- 变量管理按钮 - 仅在高级模式下显示 -->
|
||||
<ActionButtonUI
|
||||
v-if="advancedModeEnabled"
|
||||
icon="📊"
|
||||
:text="$t('nav.variableManager')"
|
||||
@click="showVariableManager = true"
|
||||
/>
|
||||
```
|
||||
**核心价值**: 既保持简洁性,又提供高级功能的可发现性
|
||||
|
||||
### 3. 多LLM提供商统一接口模式
|
||||
**架构策略**: 抽象统一接口,各提供商适配转换
|
||||
```typescript
|
||||
// 统一的工具调用结果格式
|
||||
export interface ToolCall {
|
||||
id: string;
|
||||
type: 'function';
|
||||
function: {
|
||||
name: string;
|
||||
arguments: string;
|
||||
};
|
||||
}
|
||||
|
||||
// OpenAI直接映射
|
||||
const openaiToolCall = chunk.choices[0]?.delta?.tool_calls?.[0];
|
||||
|
||||
// Gemini需要转换
|
||||
const geminiToolCall: ToolCall = {
|
||||
id: `call_${Date.now()}`,
|
||||
type: 'function' as const,
|
||||
function: {
|
||||
name: functionCall.name,
|
||||
arguments: JSON.stringify(functionCall.args)
|
||||
}
|
||||
};
|
||||
```
|
||||
**关键优势**: 新增LLM提供商时只需实现转换逻辑,业务代码无需修改
|
||||
|
||||
## 🛠️ 技术实现经验
|
||||
|
||||
### 1. Vue 3响应式状态管理最佳实践
|
||||
**模式**: 组合式API + 服务注入
|
||||
```typescript
|
||||
// ✅ 推荐的状态管理方式
|
||||
export function useVariableManager() {
|
||||
const customVariables = ref<Record<string, string>>({});
|
||||
|
||||
// 响应式计算属性
|
||||
const allVariables = computed(() => {
|
||||
return { ...predefinedVariables.value, ...customVariables.value };
|
||||
});
|
||||
|
||||
// 方法封装
|
||||
const setVariable = (name: string, value: string) => {
|
||||
customVariables.value[name] = value;
|
||||
saveToStorage(); // 自动持久化
|
||||
};
|
||||
|
||||
return { allVariables, setVariable };
|
||||
}
|
||||
```
|
||||
**避坑指南**: 不要在computed中进行副作用操作,保持纯函数特性
|
||||
|
||||
### 2. TypeScript类型安全实践
|
||||
**关键技巧**: 使用字面量类型和断言确保类型安全
|
||||
```typescript
|
||||
// 问题:string类型不能赋值给字面量类型
|
||||
const toolCall = {
|
||||
type: 'function' // TypeScript推断为string
|
||||
};
|
||||
|
||||
// 解决方案1:使用as const断言
|
||||
const toolCall = {
|
||||
type: 'function' as const // 推断为'function'
|
||||
};
|
||||
|
||||
// 解决方案2:显式类型声明
|
||||
const toolCall: ToolCall = {
|
||||
type: 'function' // 符合ToolCall类型定义
|
||||
};
|
||||
```
|
||||
|
||||
### 3. 组件状态同步策略
|
||||
**问题**: 多个组件实例导致状态不一致
|
||||
**解决方案**: 统一实例管理
|
||||
```typescript
|
||||
// App.vue 创建统一实例
|
||||
const variableManager = new VariableManager();
|
||||
|
||||
// 子组件优先使用传入实例
|
||||
const activeVariableManager = computed(() => {
|
||||
return props.variableManager || localVariableManager;
|
||||
});
|
||||
```
|
||||
**关键原则**: 单一数据源,避免状态分散
|
||||
|
||||
### 4. 主题CSS集成模式
|
||||
**策略**: 使用语义化CSS类而非硬编码样式
|
||||
```vue
|
||||
<!-- ❌ 硬编码样式 -->
|
||||
<div class="bg-white dark:bg-gray-800 border rounded-lg p-4">
|
||||
|
||||
<!-- ✅ 使用主题系统 -->
|
||||
<div class="theme-manager-card theme-manager-padding">
|
||||
```
|
||||
**优势**: 自动适配主题切换,减少维护成本
|
||||
|
||||
## 🚫 避坑指南
|
||||
|
||||
### 1. 接口扩展的时机选择
|
||||
**错误做法**: 过早创建新接口
|
||||
```typescript
|
||||
// ❌ 不要过早抽象
|
||||
interface BasicRequest { /* ... */ }
|
||||
interface AdvancedRequest { /* ... */ }
|
||||
interface SuperAdvancedRequest { /* ... */ }
|
||||
```
|
||||
**正确做法**: 基于可选字段渐进式扩展
|
||||
```typescript
|
||||
// ✅ 渐进式扩展
|
||||
interface Request {
|
||||
// 核心字段
|
||||
basic: string;
|
||||
// 第一次扩展
|
||||
advanced?: AdvancedOptions;
|
||||
// 第二次扩展
|
||||
superAdvanced?: SuperAdvancedOptions;
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 组件通信复杂度控制
|
||||
**反模式**: 深层props传递
|
||||
```vue
|
||||
<!-- ❌ 避免深层传递 -->
|
||||
<GrandParent>
|
||||
<Parent :data="data">
|
||||
<Child :data="data">
|
||||
<GrandChild :data="data" />
|
||||
</Child>
|
||||
</Parent>
|
||||
</GrandParent>
|
||||
```
|
||||
**推荐模式**: 服务层解耦
|
||||
```typescript
|
||||
// ✅ 通过服务层通信
|
||||
const variableService = inject('variableService');
|
||||
// 任何组件都可以直接使用服务
|
||||
```
|
||||
|
||||
### 3. 性能优化的时机
|
||||
**错误时机**: 功能未完成就开始优化
|
||||
**正确时机**: 功能完整后针对性优化
|
||||
```typescript
|
||||
// 功能完成后的性能优化
|
||||
const debouncedSave = debounce(saveVariables, 300);
|
||||
const virtualizedList = useVirtualList(largeVariableList);
|
||||
```
|
||||
|
||||
### 4. 测试用例的设计误区
|
||||
**错误方式**: 只测试正常流程
|
||||
**正确方式**: 重点测试边界情况
|
||||
```typescript
|
||||
describe('VariableManager', () => {
|
||||
it('should handle invalid variable names', () => {
|
||||
// 测试特殊字符、空字符串、保留字等
|
||||
});
|
||||
|
||||
it('should recover from storage corruption', () => {
|
||||
// 测试存储数据损坏的恢复机制
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
## 🔄 架构设计经验
|
||||
|
||||
### 1. 服务层职责划分原则
|
||||
**UI层职责**: 用户交互、状态展示、本地状态管理
|
||||
```typescript
|
||||
// UI层:变量管理UI逻辑
|
||||
export class VariableManagerUI {
|
||||
private customVariables = ref({});
|
||||
|
||||
// UI相关方法:验证、格式化、本地存储
|
||||
validateAndSave(name: string, value: string) { /* ... */ }
|
||||
}
|
||||
```
|
||||
|
||||
**Core层职责**: 业务逻辑、数据处理、API调用
|
||||
```typescript
|
||||
// Core层:模板处理逻辑
|
||||
export class TemplateProcessor {
|
||||
// 纯业务逻辑:变量替换、模板渲染
|
||||
replaceVariables(template: string, variables: Record<string, string>) { /* ... */ }
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 扩展点设计模式
|
||||
**策略**: 预留扩展接口,支持插件化
|
||||
```typescript
|
||||
export interface IVariableProvider {
|
||||
getVariables(): Record<string, string>;
|
||||
}
|
||||
|
||||
export class VariableManager {
|
||||
private providers: IVariableProvider[] = [];
|
||||
|
||||
// 支持插件注册
|
||||
addProvider(provider: IVariableProvider) {
|
||||
this.providers.push(provider);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 错误处理层次化策略
|
||||
```typescript
|
||||
// 层次1:业务逻辑错误
|
||||
class VariableValidationError extends Error {
|
||||
constructor(variableName: string) {
|
||||
super(`Invalid variable name: ${variableName}`);
|
||||
}
|
||||
}
|
||||
|
||||
// 层次2:系统级错误
|
||||
class StorageError extends Error {
|
||||
constructor(operation: string) {
|
||||
super(`Storage ${operation} failed`);
|
||||
}
|
||||
}
|
||||
|
||||
// 层次3:用户友好提示
|
||||
const handleError = (error: Error) => {
|
||||
if (error instanceof VariableValidationError) {
|
||||
toast.warning('变量名格式不正确');
|
||||
} else {
|
||||
toast.error('操作失败,请重试');
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## 💡 创新解决方案
|
||||
|
||||
### 1. 智能会话模板配置系统
|
||||
**创新点**: 根据优化模式自动生成合适的测试环境
|
||||
```typescript
|
||||
// 传统方式:用户手动配置测试环境
|
||||
// 创新方式:智能模板生成
|
||||
if (optimizationMode === 'system') {
|
||||
// 系统提示词:创建系统+用户消息对
|
||||
conversationMessages = [
|
||||
{ role: 'system', content: '{{currentPrompt}}' },
|
||||
{ role: 'user', content: '请展示你的能力并与我互动' }
|
||||
];
|
||||
} else {
|
||||
// 用户提示词:创建用户消息
|
||||
conversationMessages = [
|
||||
{ role: 'user', content: '{{currentPrompt}}' }
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 变量工具分离设计
|
||||
**设计决策**: 变量系统和工具系统完全分离
|
||||
**理由**: 避免概念混淆,简化用户理解
|
||||
```typescript
|
||||
// 变量:用于内容模板化
|
||||
const variables = { userName: 'Alice', task: 'coding' };
|
||||
const template = 'Hello {{userName}}, let\'s start {{task}}';
|
||||
|
||||
// 工具:用于LLM功能调用
|
||||
const tools = [{
|
||||
function: { name: 'get_weather', parameters: { ... } }
|
||||
}];
|
||||
```
|
||||
|
||||
### 3. 渐进式功能暴露机制
|
||||
**创新**: 通过UI状态控制功能可见性
|
||||
```typescript
|
||||
const featureVisibility = computed(() => ({
|
||||
basicMode: true,
|
||||
advancedMode: advancedModeEnabled.value,
|
||||
variableManager: advancedModeEnabled.value,
|
||||
toolManager: advancedModeEnabled.value && hasTools.value
|
||||
}));
|
||||
```
|
||||
|
||||
## 📚 可复用模式库
|
||||
|
||||
### 1. 可选功能扩展模式
|
||||
适用于任何需要向后兼容的功能增强场景:
|
||||
1. 定义可选字段的接口扩展
|
||||
2. 实现新功能的独立组件
|
||||
3. 通过配置控制功能启用
|
||||
4. 保持默认行为不变
|
||||
|
||||
### 2. 服务注入 + 组合式API模式
|
||||
适用于复杂状态管理场景:
|
||||
1. 创建服务类封装业务逻辑
|
||||
2. 使用组合式API封装响应式状态
|
||||
3. 通过依赖注入实现组件解耦
|
||||
4. 支持单元测试和模拟
|
||||
|
||||
### 3. 多提供商适配模式
|
||||
适用于需要集成多个第三方服务的场景:
|
||||
1. 定义统一的接口抽象
|
||||
2. 为每个提供商实现适配器
|
||||
3. 使用工厂模式选择具体实现
|
||||
4. 保持业务代码与提供商无关
|
||||
|
||||
## 🔮 后续演进建议
|
||||
|
||||
### 短期优化 (1个月内)
|
||||
1. **性能监控**: 添加变量解析和工具调用的性能指标
|
||||
2. **用户体验**: 更多智能默认值和快捷操作
|
||||
3. **错误处理**: 改进边缘情况的错误提示
|
||||
|
||||
### 中期扩展 (3个月内)
|
||||
1. **模板市场**: 支持预设的变量和工具模板分享
|
||||
2. **使用分析**: 记录功能使用情况,指导优化方向
|
||||
3. **协作功能**: 支持团队共享变量和工具定义
|
||||
|
||||
### 长期愿景 (6个月以上)
|
||||
1. **AI增强**: 智能推荐变量、自动生成测试用例
|
||||
2. **可视化编辑**: 拖拽式会话流程设计器
|
||||
3. **企业级功能**: 权限管理、审计日志、批量操作
|
||||
|
||||
这些经验和模式可以应用到任何大型功能开发中,特别是需要保持向后兼容性和用户体验平滑升级的场景。
|
||||
@@ -0,0 +1,281 @@
|
||||
# 技术实现详解
|
||||
|
||||
## 🔧 架构设计
|
||||
|
||||
### 整体架构演进
|
||||
```
|
||||
原始架构 扩展后架构
|
||||
┌─────────────┐ ┌─────────────────────────────────┐
|
||||
│ BasicTestPanel │ → │ AdvancedTestPanel (主组件) │
|
||||
└─────────────┘ │ ├── BasicTestMode │
|
||||
│ ├── ConversationManager │
|
||||
│ ├── VariableManagerModal │
|
||||
│ └── ToolManager │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 核心设计原则
|
||||
1. **最小侵入** - 基于现有架构进行最小化扩展
|
||||
2. **向后兼容** - 所有新功能都是可选的
|
||||
3. **职责分离** - UI层管理变量,Core层处理逻辑
|
||||
4. **类型安全** - 完整的TypeScript类型支持
|
||||
|
||||
## 🧪 高级变量管理实现
|
||||
|
||||
### 1. VariableManager服务架构
|
||||
```typescript
|
||||
export class VariableManager implements IVariableManager {
|
||||
private customVariables: Record<string, string> = {};
|
||||
private readonly predefinedVariables = [
|
||||
'originalPrompt',
|
||||
'lastOptimizedPrompt',
|
||||
'iterateInput',
|
||||
'currentPrompt' // 新增:测试阶段使用
|
||||
];
|
||||
|
||||
// 变量CRUD操作
|
||||
setVariable(name: string, value: string): void {
|
||||
if (!this.validateVariableName(name)) {
|
||||
throw new Error(`Invalid variable name: ${name}`);
|
||||
}
|
||||
this.customVariables[name] = value;
|
||||
this.saveCustomVariables();
|
||||
}
|
||||
|
||||
// 解析所有变量(预定义 + 自定义)
|
||||
resolveAllVariables(context: TemplateContext): Record<string, string> {
|
||||
const predefinedVars = this.extractPredefinedVariables(context);
|
||||
return { ...predefinedVars, ...this.customVariables };
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. ConversationManager实现
|
||||
```typescript
|
||||
export function useConversationManager() {
|
||||
const messages = ref<ConversationMessage[]>([]);
|
||||
|
||||
// 检测缺失变量
|
||||
const getMissingVariables = (content: string): string[] => {
|
||||
const referencedVars = variableManager.scanVariablesInContent(content);
|
||||
const availableVars = Object.keys(variableManager.listVariables());
|
||||
return referencedVars.filter(variable => !availableVars.includes(variable));
|
||||
};
|
||||
|
||||
// 预览消息(变量替换后)
|
||||
const previewMessages = (variables: Record<string, string>): ConversationMessage[] => {
|
||||
return messages.value.map(message => ({
|
||||
...message,
|
||||
content: replaceVariables(message.content, variables)
|
||||
}));
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 界面重新设计实现
|
||||
```vue
|
||||
<!-- MainLayout导航菜单集成 -->
|
||||
<div class="navigation-actions">
|
||||
<!-- 高级模式导航按钮 -->
|
||||
<ActionButtonUI
|
||||
icon="🚀"
|
||||
:text="$t('nav.advancedMode')"
|
||||
@click="toggleAdvancedMode"
|
||||
:class="{ 'active-button': advancedModeEnabled }"
|
||||
/>
|
||||
|
||||
<!-- 变量管理按钮 - 仅在高级模式下显示 -->
|
||||
<ActionButtonUI
|
||||
v-if="advancedModeEnabled"
|
||||
icon="📊"
|
||||
:text="$t('nav.variableManager')"
|
||||
@click="showVariableManager = true"
|
||||
/>
|
||||
</div>
|
||||
```
|
||||
|
||||
## 🛠️ 工具调用功能实现
|
||||
|
||||
### 1. 统一工具调用接口设计
|
||||
```typescript
|
||||
export interface ToolCall {
|
||||
id: string;
|
||||
type: 'function';
|
||||
function: {
|
||||
name: string;
|
||||
arguments: string;
|
||||
};
|
||||
}
|
||||
|
||||
export interface StreamHandlers {
|
||||
onToken: (token: string) => void;
|
||||
onReasoningToken?: (token: string) => void;
|
||||
onToolCall?: (toolCall: ToolCall) => void; // 新增
|
||||
onComplete: (response?: LLMResponse) => void;
|
||||
onError: (error: Error) => void;
|
||||
}
|
||||
```
|
||||
|
||||
### 2. OpenAI工具调用实现
|
||||
```typescript
|
||||
async streamOpenAIMessageWithTools(
|
||||
messages: Message[],
|
||||
modelConfig: ModelConfig,
|
||||
tools: ToolDefinition[],
|
||||
callbacks: StreamHandlers
|
||||
): Promise<void> {
|
||||
const completionConfig: any = {
|
||||
model: modelConfig.defaultModel,
|
||||
messages: formattedMessages,
|
||||
tools: tools,
|
||||
tool_choice: 'auto',
|
||||
stream: true,
|
||||
...restLlmParams
|
||||
};
|
||||
|
||||
// 处理工具调用delta
|
||||
const toolCallDeltas = chunk.choices[0]?.delta?.tool_calls;
|
||||
if (toolCallDeltas) {
|
||||
for (const toolCallDelta of toolCallDeltas) {
|
||||
// delta处理逻辑
|
||||
if (callbacks.onToolCall) {
|
||||
callbacks.onToolCall(currentToolCall);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Gemini工具调用适配
|
||||
```typescript
|
||||
async streamGeminiMessageWithTools(
|
||||
messages: Message[],
|
||||
modelConfig: ModelConfig,
|
||||
tools: ToolDefinition[],
|
||||
callbacks: StreamHandlers
|
||||
): Promise<void> {
|
||||
// 转换工具格式为Gemini标准
|
||||
const geminiTools = this.convertToGeminiTools(tools);
|
||||
|
||||
// 处理Gemini工具调用
|
||||
const functionCalls = chunk.functionCalls();
|
||||
if (functionCalls && functionCalls.length > 0) {
|
||||
for (const functionCall of functionCalls) {
|
||||
const toolCall: ToolCall = {
|
||||
id: `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
|
||||
type: 'function' as const,
|
||||
function: {
|
||||
name: functionCall.name,
|
||||
arguments: JSON.stringify(functionCall.args)
|
||||
}
|
||||
};
|
||||
|
||||
if (callbacks.onToolCall) {
|
||||
callbacks.onToolCall(toolCall);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📝 关键问题解决记录
|
||||
|
||||
### 问题1: 变量状态同步问题
|
||||
**问题**: AdvancedTestPanel 创建独立的变量管理器实例,导致数据不同步
|
||||
**解决方案**: 统一变量管理器实例
|
||||
```typescript
|
||||
const variableManager: Ref<VariableManagerHooks | null> = computed(() => {
|
||||
if (props.variableManager) {
|
||||
return props.variableManager // 使用App.vue传入的统一实例
|
||||
}
|
||||
return localVariableManager // 后备方案
|
||||
})
|
||||
```
|
||||
|
||||
### 问题2: TypeScript类型安全问题
|
||||
**问题**: 工具调用类型'string'不能赋值给'"function"'
|
||||
**解决方案**: 使用字面量类型断言
|
||||
```typescript
|
||||
const toolCall: ToolCall = {
|
||||
id: `call_${Date.now()}`,
|
||||
type: 'function' as const, // 添加 as const 断言
|
||||
function: {
|
||||
name: functionCall.name,
|
||||
arguments: JSON.stringify(functionCall.args)
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### 问题3: 主题CSS集成问题
|
||||
**问题**: 新组件使用硬编码样式,与主题系统不一致
|
||||
**解决方案**: 使用项目统一的主题CSS类
|
||||
```vue
|
||||
<div class="add-message-row theme-manager-card">
|
||||
<button class="add-message-btn theme-manager-button-secondary">
|
||||
添加消息
|
||||
</button>
|
||||
</div>
|
||||
```
|
||||
|
||||
## 🔄 Apply to Test功能创新实现
|
||||
|
||||
### 智能模板配置系统
|
||||
从简单的高级模式启用转变为智能测试配置:
|
||||
```typescript
|
||||
const applyOptimizedPromptToTest = (optimizationData: {
|
||||
originalPrompt: string
|
||||
optimizedPrompt: string
|
||||
optimizationMode: string
|
||||
}) => {
|
||||
if (optimizationData.optimizationMode === 'system') {
|
||||
// 系统提示词优化:系统消息 + 用户交互消息
|
||||
conversationMessages.value = [
|
||||
{ role: 'system', content: '{{currentPrompt}}' },
|
||||
{ role: 'user', content: '请按照你的角色设定,展示你的能力并与我互动。' }
|
||||
]
|
||||
} else {
|
||||
// 用户提示词优化:仅用户消息
|
||||
conversationMessages.value = [
|
||||
{ role: 'user', content: '{{currentPrompt}}' }
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🧪 测试验证
|
||||
|
||||
### MCP工具端到端测试
|
||||
使用MCP Playwright工具完成完整workflow验证:
|
||||
1. **工具创建** - 在ContextEditor中创建get_weather工具
|
||||
2. **工具同步** - 从优化阶段同步到测试阶段
|
||||
3. **提示词优化** - 优化天气助手系统提示词
|
||||
4. **工具调用测试** - 执行Gemini工具调用测试
|
||||
5. **结果验证** - 确认工具调用信息正确传递
|
||||
|
||||
### 测试结果
|
||||
- ✅ 工具定义正确创建和保存
|
||||
- ✅ UI显示"工具: 1"和"使用的工具: get_weather"
|
||||
- ✅ Gemini API正确携带工具信息
|
||||
- ✅ 工具调用流程完整执行
|
||||
- ✅ 测试结果显示AI响应和工具意图
|
||||
|
||||
## 📊 架构优势
|
||||
|
||||
### 1. 多提供商兼容性
|
||||
- **OpenAI** - 直接使用tool_calls delta处理
|
||||
- **Gemini** - 转换functionCalls()到标准ToolCall格式
|
||||
- **向后兼容** - 现有API无破坏性变更
|
||||
|
||||
### 2. 组件解耦设计
|
||||
```
|
||||
ContextEditor (工具创建和管理)
|
||||
↓
|
||||
ConversationManager (工具统计和同步)
|
||||
↓
|
||||
AdvancedTestPanel (工具调用测试)
|
||||
```
|
||||
|
||||
### 3. 数据流管理
|
||||
- **工具变量分离** - 工具定义不使用变量系统
|
||||
- **统一消息结构** - ConversationMessage在优化和测试阶段复用
|
||||
- **状态持久化** - 使用统一的preferenceService
|
||||
@@ -53,6 +53,7 @@
|
||||
### 功能扩展系列 (已完成)
|
||||
- [121-multi-custom-models-support](./121-multi-custom-models-support/) - 多自定义模型环境变量支持 ✅
|
||||
- [122-docker-api-proxy](./122-docker-api-proxy/) - Docker API代理功能实现 ✅
|
||||
- [123-advanced-features-implementation](./123-advanced-features-implementation/) - 高级功能完整实现 ✅
|
||||
|
||||
## 📋 文档结构
|
||||
|
||||
@@ -81,7 +82,7 @@
|
||||
- **服务重构系列**:113
|
||||
|
||||
### 按状态查找
|
||||
- **已完成**:101, 102, 103, 108, 109, 110, 111, 112, 114, 115, 116, 117, 118, 119, 120, 121, 122
|
||||
- **已完成**:101, 102, 103, 108, 109, 110, 111, 112, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123
|
||||
- **进行中**:106, 107, 113
|
||||
- **计划中**:104, 105
|
||||
|
||||
@@ -94,7 +95,7 @@
|
||||
|
||||
## 🔄 维护说明
|
||||
|
||||
- **新功能归档**:从123开始继续编号
|
||||
- **新功能归档**:从124开始继续编号
|
||||
- **文档更新**:功能完成后及时更新状态和经验总结
|
||||
- **交叉引用**:在相关功能点之间建立引用关系
|
||||
- **合并原则**:当同一功能领域有3个以上相关文档时考虑合并
|
||||
@@ -120,8 +121,8 @@
|
||||
|
||||
## 📊 统计信息
|
||||
|
||||
- **总归档数**: 22
|
||||
- **已完成**: 17
|
||||
- **总归档数**: 23
|
||||
- **已完成**: 18
|
||||
- **进行中**: 3
|
||||
- **计划中**: 2
|
||||
- **下一个编号**: 123
|
||||
- **下一个编号**: 124
|
||||
@@ -13,7 +13,8 @@
|
||||
- **大型架构重构经验** → [117-import-export-architecture-refactor/experience.md](../archives/117-import-export-architecture-refactor/experience.md)
|
||||
- **版本更新系统经验** → [118-desktop-auto-update-system/experience.md](../archives/118-desktop-auto-update-system/experience.md)
|
||||
- **MCP Server 模块开发经验** → [120-mcp-server-module/experience.md](../archives/120-mcp-server-module/experience.md)
|
||||
- **多自定义模型支持经验** → [121-multi-custom-models-support/experience.md](../archives/121-multi-custom-models-support/experience.md)
|
||||
- **Docker API代理经验** → [122-docker-api-proxy/experience.md](../archives/122-docker-api-proxy/experience.md)
|
||||
- **高级功能完整实现经验** → [123-advanced-features-implementation/experience.md](../archives/123-advanced-features-implementation/experience.md)
|
||||
|
||||
## 🔧 通用开发规范
|
||||
|
||||
|
||||
@@ -4,6 +4,25 @@
|
||||
|
||||
## 🚨 高优先级任务
|
||||
|
||||
### 高级功能性能优化 (来自123归档)
|
||||
**目标**: 优化高级变量管理和工具调用功能的性能
|
||||
**来源**: 123-advanced-features-implementation归档
|
||||
|
||||
#### 1. 性能优化 - 中优先级
|
||||
- [ ] 大量变量时的渲染性能优化 - 影响用户体验 - 2-3小时
|
||||
- [ ] 变量扫描缓存机制 - 避免重复正则匹配 - 1-2小时
|
||||
- [ ] 组件懒加载优化 - 高级模式组件按需加载 - 1小时
|
||||
|
||||
#### 2. 工具调用功能增强 - 中优先级
|
||||
- [ ] 工具调用结果展示UI优化 - 提升可视化体验 - 2-3小时
|
||||
- [ ] 更多内置工具模板 - 提升开箱即用体验 - 2-3小时
|
||||
- [ ] 工具调用错误处理增强 - 提升稳定性 - 1-2小时
|
||||
|
||||
#### 3. 边缘情况处理 - 低优先级
|
||||
- [ ] 特殊字符和超长文本处理 - 1-2小时
|
||||
- [ ] 存储数据损坏的恢复机制 - 1小时
|
||||
- [ ] 更完善的变量名验证逻辑 - 30分钟
|
||||
|
||||
### 导入导出架构后续优化 (来自117归档)
|
||||
**目标**: 完善导入导出架构的细节优化
|
||||
**来源**: 117-import-export-architecture-refactor归档
|
||||
|
||||
@@ -1,320 +0,0 @@
|
||||
# 界面优化修复报告 (2025-08-26)
|
||||
|
||||
## 📋 修复概述
|
||||
|
||||
**修复日期**: 2025-08-26
|
||||
**修复类型**: 界面优化与数据同步修复
|
||||
**涉及组件**: ConversationManager, AdvancedTestPanel, App.vue, VariableManagerModal
|
||||
**修复人员**: Claude Code Assistant
|
||||
|
||||
## 🎯 修复的问题
|
||||
|
||||
### 问题1: 添加消息区域未使用项目主题CSS
|
||||
**问题描述**: 添加消息区域使用硬编码的CSS样式,不符合项目的主题系统,无法跟随主题切换。
|
||||
|
||||
**影响范围**: ConversationManager.vue 的添加消息行样式
|
||||
|
||||
**解决方案**:
|
||||
- 将 `add-message-row` 添加 `theme-manager-card` 类
|
||||
- 将 `add-message-btn` 添加 `theme-manager-button-secondary` 类
|
||||
- 移除硬编码的背景色、边框色等样式
|
||||
- 保留必要的布局样式
|
||||
|
||||
**修复代码**:
|
||||
```vue
|
||||
<!-- 修复前 -->
|
||||
<div class="add-message-row">
|
||||
<button class="add-message-btn w-full">
|
||||
|
||||
<!-- 修复后 -->
|
||||
<div class="add-message-row theme-manager-card">
|
||||
<button class="add-message-btn theme-manager-button-secondary w-full">
|
||||
```
|
||||
|
||||
```css
|
||||
/* 修复前 - 硬编码样式 */
|
||||
.add-message-row {
|
||||
background: #f8fafc;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.add-message-btn {
|
||||
border: 1px dashed #cbd5e0;
|
||||
background: white;
|
||||
color: #6b7280;
|
||||
}
|
||||
|
||||
/* 修复后 - 主题类驱动 */
|
||||
.add-message-row {
|
||||
border-radius: 6px; /* 保留必要的布局样式 */
|
||||
}
|
||||
|
||||
.add-message-btn {
|
||||
border: 1px dashed; /* 让主题系统控制颜色 */
|
||||
border-radius: 4px;
|
||||
}
|
||||
```
|
||||
|
||||
### 问题2: 变量状态同步失效
|
||||
**问题描述**: 用户在变量管理器中添加变量后,会话管理区域仍然显示该变量为"缺失"状态,界面数据不同步。
|
||||
|
||||
**根本原因**: AdvancedTestPanel 组件创建了独立的变量管理器实例,与 App.vue 中的变量管理器实例数据不同步。
|
||||
|
||||
**技术分析**:
|
||||
```typescript
|
||||
// 问题代码:AdvancedTestPanel.vue
|
||||
const variableManager: VariableManagerHooks = useVariableManager(
|
||||
computed(() => props.services), // 创建了新实例
|
||||
{ autoSync: true }
|
||||
)
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
1. **修改 Props 接口**: 在 AdvancedTestPanel 添加 `variableManager` prop
|
||||
2. **实例优先策略**: 优先使用传入的变量管理器实例
|
||||
3. **更新引用**: 修复所有 `variableManager.xxx` 引用为 `variableManager.value?.xxx`
|
||||
4. **App.vue 传递**: 将统一的变量管理器实例传递给子组件
|
||||
|
||||
**修复代码**:
|
||||
```typescript
|
||||
// AdvancedTestPanel.vue - 修复后
|
||||
interface Props {
|
||||
// ... 其他props
|
||||
variableManager?: VariableManagerHooks | null // 新增
|
||||
}
|
||||
|
||||
// 优先使用传入的变量管理器实例
|
||||
const variableManager: Ref<VariableManagerHooks | null> = computed(() => {
|
||||
if (props.variableManager) {
|
||||
return props.variableManager // 使用App.vue的统一实例
|
||||
}
|
||||
return localVariableManager // 后备方案:本地实例
|
||||
})
|
||||
|
||||
// App.vue - 传递统一实例
|
||||
<AdvancedTestPanel
|
||||
:variable-manager="variableManager"
|
||||
:open-variable-manager="openVariableManager"
|
||||
/>
|
||||
```
|
||||
|
||||
### 问题3: 点击缺失变量后变量管理器数据不刷新
|
||||
**问题描述**: 点击缺失的变量按钮时,变量管理器打开但数据没有立即刷新,且没有自动进入对应变量的编辑界面。
|
||||
|
||||
**解决方案**:
|
||||
1. **强制数据刷新**: 在打开变量管理器前调用 `variableManager.refresh()`
|
||||
2. **焦点变量功能**: 为 VariableManagerModal 添加 `focusVariable` prop
|
||||
3. **自动编辑器**: 监听 `focusVariable` 变化,自动打开对应变量的编辑器
|
||||
4. **事件传递链**: 完善从点击到编辑的完整事件流
|
||||
|
||||
**修复代码**:
|
||||
```typescript
|
||||
// App.vue - 强制刷新和焦点变量
|
||||
const openVariableManager = (variableName?: string) => {
|
||||
// 强制刷新变量管理器数据
|
||||
if (variableManager?.refresh) {
|
||||
variableManager.refresh()
|
||||
}
|
||||
// 设置要聚焦的变量名
|
||||
focusVariableName.value = variableName
|
||||
showVariableManager.value = true
|
||||
}
|
||||
|
||||
// VariableManagerModal.vue - 自动打开编辑器
|
||||
watch(() => props.visible, (visible) => {
|
||||
if (visible && props.focusVariable) {
|
||||
const targetVariable = allVariables.value.find(v => v.name === props.focusVariable)
|
||||
if (targetVariable) {
|
||||
editingVariable.value = targetVariable
|
||||
showEditor.value = true
|
||||
} else {
|
||||
// 创建新变量
|
||||
editingVariable.value = {
|
||||
name: props.focusVariable,
|
||||
value: '',
|
||||
source: 'custom'
|
||||
}
|
||||
showEditor.value = true
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### 问题4: 高级模式选择不持久化
|
||||
**问题描述**: 用户切换到高级模式后,刷新页面设置会丢失,每次都需要重新开启高级模式。
|
||||
|
||||
**解决方案**:
|
||||
1. **使用 preferenceService**: 利用项目统一的设置存储服务
|
||||
2. **异步加载**: 在应用初始化时加载保存的设置
|
||||
3. **异步保存**: 在设置变更时自动保存到存储
|
||||
4. **错误处理**: 添加完善的错误处理和日志记录
|
||||
|
||||
**修复代码**:
|
||||
```typescript
|
||||
// App.vue - 持久化实现
|
||||
// 加载高级模式设置
|
||||
const loadAdvancedModeSetting = async () => {
|
||||
if (services.value?.preferenceService) {
|
||||
try {
|
||||
const saved = await services.value.preferenceService.get('advancedModeEnabled', false)
|
||||
advancedModeEnabled.value = saved
|
||||
console.log(`[App] Loaded advanced mode setting: ${saved}`)
|
||||
} catch (error) {
|
||||
console.error('[App] Failed to load advanced mode setting:', error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 保存高级模式设置
|
||||
const saveAdvancedModeSetting = async (enabled: boolean) => {
|
||||
if (services.value?.preferenceService) {
|
||||
try {
|
||||
await services.value.preferenceService.set('advancedModeEnabled', enabled)
|
||||
console.log(`[App] Saved advanced mode setting: ${enabled}`)
|
||||
} catch (error) {
|
||||
console.error('[App] Failed to save advanced mode setting:', error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 切换时保存设置
|
||||
const toggleAdvancedMode = async () => {
|
||||
advancedModeEnabled.value = !advancedModeEnabled.value
|
||||
await saveAdvancedModeSetting(advancedModeEnabled.value)
|
||||
}
|
||||
|
||||
// 应用初始化时加载设置
|
||||
watch(services, async (newServices) => {
|
||||
if (newServices) {
|
||||
await loadAdvancedModeSetting()
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
## 📊 修复统计
|
||||
|
||||
### 修改文件统计
|
||||
| 文件 | 修改类型 | 修改行数 | 状态 |
|
||||
|------|----------|----------|------|
|
||||
| ConversationManager.vue | CSS主题集成 | ~15行 | ✅ 完成 |
|
||||
| AdvancedTestPanel.vue | 变量管理器重构 | ~25行 | ✅ 完成 |
|
||||
| VariableManagerModal.vue | 焦点变量功能 | ~20行 | ✅ 完成 |
|
||||
| App.vue | 数据刷新与持久化 | ~30行 | ✅ 完成 |
|
||||
|
||||
### 功能验证结果
|
||||
- ✅ **主题CSS**: 添加消息区域正确使用主题样式
|
||||
- ✅ **变量同步**: 添加变量后会话管理区域立即更新状态
|
||||
- ✅ **数据刷新**: 点击缺失变量后变量管理器数据实时刷新
|
||||
- ✅ **自动编辑**: 点击缺失变量自动打开对应变量的编辑界面
|
||||
- ✅ **设置持久化**: 高级模式选择在刷新后保持状态
|
||||
|
||||
## 🔧 技术亮点
|
||||
|
||||
### 1. 统一变量管理器实例
|
||||
通过 props 传递统一的变量管理器实例,避免了多实例数据不同步的问题:
|
||||
```typescript
|
||||
// 核心策略:实例共享
|
||||
const variableManager = computed(() =>
|
||||
props.variableManager || localVariableManager
|
||||
)
|
||||
```
|
||||
|
||||
### 2. 主题系统集成
|
||||
使用项目统一的主题CSS类,确保界面风格一致性:
|
||||
```css
|
||||
/* 主题驱动的样式 */
|
||||
.theme-manager-card /* 卡片样式 */
|
||||
.theme-manager-button-secondary /* 次要按钮样式 */
|
||||
.theme-manager-text-secondary /* 次要文本样式 */
|
||||
```
|
||||
|
||||
### 3. 响应式焦点变量
|
||||
通过 watcher 监听变量变化,自动打开编辑界面:
|
||||
```typescript
|
||||
watch(() => props.focusVariable, (variableName) => {
|
||||
if (variableName) {
|
||||
// 自动打开对应变量的编辑器
|
||||
openVariableEditor(variableName)
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### 4. 异步设置持久化
|
||||
使用项目统一的 preferenceService 进行设置存储:
|
||||
```typescript
|
||||
// 统一的存储机制
|
||||
await preferenceService.set('advancedModeEnabled', enabled)
|
||||
const saved = await preferenceService.get('advancedModeEnabled', false)
|
||||
```
|
||||
|
||||
## 🚀 用户体验改进
|
||||
|
||||
### 改进前
|
||||
- 添加消息区域样式不统一,无法跟随主题
|
||||
- 添加变量后需要手动刷新才能看到状态更新
|
||||
- 点击缺失变量需要手动找到并编辑对应变量
|
||||
- 高级模式设置每次刷新都丢失
|
||||
|
||||
### 改进后
|
||||
- 添加消息区域完美融入项目主题系统
|
||||
- 变量状态实时同步,无需任何手动操作
|
||||
- 点击缺失变量一键直达编辑界面,极大提升效率
|
||||
- 高级模式设置永久保存,提供一致的用户体验
|
||||
|
||||
## 🔍 测试验证
|
||||
|
||||
### 测试场景1: 主题CSS验证
|
||||
1. 切换到暗色主题
|
||||
2. 检查添加消息区域是否正确应用暗色主题样式
|
||||
3. 验证按钮悬停效果是否符合主题规范
|
||||
|
||||
**结果**: ✅ 通过,样式完美跟随主题变化
|
||||
|
||||
### 测试场景2: 变量状态同步验证
|
||||
1. 在会话中添加包含未定义变量的消息 `{{testVar}}`
|
||||
2. 查看是否显示"缺失变量"提示
|
||||
3. 打开变量管理器添加 `testVar` 变量
|
||||
4. 检查会话管理区域是否立即更新状态
|
||||
|
||||
**结果**: ✅ 通过,状态实时同步
|
||||
|
||||
### 测试场景3: 点击缺失变量功能验证
|
||||
1. 在消息中使用未定义变量 `{{newVar}}`
|
||||
2. 点击"缺失变量"中的 `newVar` 按钮
|
||||
3. 验证是否自动打开变量管理器
|
||||
4. 验证是否自动打开 `newVar` 的编辑界面
|
||||
5. 验证焦点是否在值输入框
|
||||
|
||||
**结果**: ✅ 通过,完整流程顺畅
|
||||
|
||||
### 测试场景4: 设置持久化验证
|
||||
1. 开启高级模式
|
||||
2. 刷新页面
|
||||
3. 检查高级模式是否保持开启状态
|
||||
4. 关闭高级模式并刷新
|
||||
5. 检查是否保持关闭状态
|
||||
|
||||
**结果**: ✅ 通过,设置正确持久化
|
||||
|
||||
## 💡 经验总结
|
||||
|
||||
### 成功要素
|
||||
1. **问题根因分析**: 通过深入分析找到变量实例不同步的根本原因
|
||||
2. **统一架构设计**: 使用统一的变量管理器实例避免数据分片
|
||||
3. **用户体验优先**: 从用户操作流程出发设计解决方案
|
||||
4. **渐进式修复**: 逐个解决问题,确保每个修复都经过验证
|
||||
|
||||
### 技术创新
|
||||
- **实例共享模式**: 通过 computed + props 实现组件间实例共享
|
||||
- **焦点变量机制**: 通过参数化的变量管理器实现精确焦点控制
|
||||
- **主题集成策略**: 用主题类替代硬编码样式的最佳实践
|
||||
|
||||
### 后续优化建议
|
||||
1. **性能优化**: 考虑变量管理器的缓存机制,避免频繁的数据重计算
|
||||
2. **用户引导**: 添加首次使用高级模式的引导提示
|
||||
3. **批量操作**: 支持批量变量的快速创建和编辑
|
||||
4. **键盘快捷键**: 为常用操作添加键盘快捷键支持
|
||||
|
||||
---
|
||||
|
||||
本次修复成功解决了用户反馈的所有界面问题,大幅提升了高级模式的用户体验,为后续功能开发奠定了坚实基础。
|
||||
@@ -1,413 +0,0 @@
|
||||
# 高级变量管理功能 - 项目完成报告
|
||||
|
||||
## 📋 执行摘要
|
||||
|
||||
**项目名称**: 高级变量管理功能开发
|
||||
**完成日期**: 2025-01-23 (初始完成)
|
||||
**重新设计日期**: 2025-01-25 (界面重新设计)
|
||||
**界面优化日期**: 2025-08-26 (界面优化修复)
|
||||
**项目状态**: ✅ 圆满完成
|
||||
**交付质量**: 🏆 超预期达成
|
||||
|
||||
本项目在保持100%向后兼容的前提下,成功为提示词优化系统添加了强大的高级模式功能,包括自定义变量管理和多轮会话测试能力。项目按时完成所有既定目标,并通过了全面的自动化测试验证。2025-01-25进行了界面重新设计,将变量管理改为独立弹窗,高级模式改为导航菜单按钮,进一步优化了用户体验。2025-08-26进行了界面优化修复,解决了主题CSS集成、变量状态同步、数据刷新和设置持久化等关键问题。
|
||||
|
||||
## 🎯 目标达成情况
|
||||
|
||||
### 主要目标达成 ✅
|
||||
| 目标 | 状态 | 达成度 | 验证结果 |
|
||||
|------|------|--------|----------|
|
||||
| 保持向后兼容性 | ✅ 完成 | 100% | 现有功能完全不受影响 |
|
||||
| 自定义变量管理 | ✅ 完成 | 100% | 支持CRUD操作、导入导出 |
|
||||
| 多轮会话测试 | ✅ 完成 | 100% | 支持复杂对话、变量预览 |
|
||||
| 双模式无缝切换 | ✅ 完成 | 100% | 智能切换、状态持久化 |
|
||||
| CSP安全保证 | ✅ 完成 | 100% | 复用现有安全机制 |
|
||||
|
||||
### 界面优化修复目标 (2025-08-26) ✅
|
||||
| 目标 | 状态 | 达成度 | 验证结果 |
|
||||
|------|------|--------|----------|
|
||||
| 主题CSS集成修复 | ✅ 完成 | 100% | 添加消息区域完美融入主题系统 |
|
||||
| 变量状态同步修复 | ✅ 完成 | 100% | 变量数据实时同步,无延迟 |
|
||||
| 数据刷新优化 | ✅ 完成 | 100% | 点击缺失变量自动刷新并聚焦 |
|
||||
| 设置持久化实现 | ✅ 完成 | 100% | 高级模式设置永久保存 |
|
||||
|
||||
### 界面重新设计目标 (2025-01-25) ✅
|
||||
| 目标 | 状态 | 达成度 | 验证结果 |
|
||||
|------|------|--------|----------|
|
||||
| 变量管理独立弹窗 | ✅ 完成 | 100% | 完全实现,正常工作 |
|
||||
| 高级模式导航按钮 | ✅ 完成 | 100% | 完全实现,正常工作 |
|
||||
| 基础模式界面不变 | ✅ 完成 | 100% | 基础模式完全保持原样 |
|
||||
| 渐进式功能发现 | ✅ 完成 | 100% | 通过导航菜单实现 |
|
||||
|
||||
### 技术目标达成 ✅
|
||||
| 技术指标 | 目标值 | 实际值 | 状态 |
|
||||
|----------|--------|--------|------|
|
||||
| 代码覆盖率 | ≥80% | 85%+ | ✅ 超标达成 |
|
||||
| 页面响应时间 | <200ms | <100ms | ✅ 超预期 |
|
||||
| 接口兼容性 | 100% | 100% | ✅ 完全达成 |
|
||||
| 功能完整性 | 100% | 100% | ✅ 完全达成 |
|
||||
|
||||
## 🏆 主要交付成果
|
||||
|
||||
### 1. 核心功能模块 ✅
|
||||
- **AdvancedTestPanel**: 高级测试面板主组件
|
||||
- **VariableManager**: 变量管理服务和UI组件
|
||||
- **VariableManagerModal**: 变量管理独立弹窗 (2025-01-25新增)
|
||||
- **ConversationManager**: 会话管理和消息编辑器
|
||||
- **BasicTestMode**: 基础模式功能封装
|
||||
- **AdvancedModeToggle**: 模式切换开关 (将被导航菜单按钮替代)
|
||||
|
||||
### 2. 接口扩展完成 ✅
|
||||
- **OptimizationRequest扩展**: 支持`advancedContext`可选字段
|
||||
- **CustomConversationRequest**: 自定义会话测试接口
|
||||
- **ConversationMessage**: 统一的消息结构定义
|
||||
- **ElectronPromptServiceProxy**: 桌面端兼容性修复
|
||||
|
||||
### 3. 服务层增强 ✅
|
||||
- **VariableManager服务**: UI层变量管理核心逻辑
|
||||
- **TemplateProcessor增强**: 支持自定义变量处理
|
||||
- **PromptService扩展**: 新增自定义会话测试方法
|
||||
- **状态管理优化**: 响应式状态、自动持久化
|
||||
|
||||
## 🧪 验证和测试结果
|
||||
|
||||
### 自动化测试验证 ✅
|
||||
```
|
||||
测试环境: 正式开发服务器 (http://localhost:18181)
|
||||
测试工具: Playwright MCP自动化测试
|
||||
```
|
||||
|
||||
#### 静态功能测试
|
||||
- ✅ **界面渲染**: 所有组件正常显示
|
||||
- ✅ **交互响应**: 按钮点击、输入框编辑正常
|
||||
- ✅ **模式切换**: 基础/高级模式无缝切换
|
||||
- ✅ **数据验证**: 变量格式、消息结构验证正确
|
||||
|
||||
#### 界面优化修复验证 (2025-08-26)
|
||||
- ✅ **主题CSS集成**: 添加消息区域完美融入主题系统,支持明暗主题切换
|
||||
- ✅ **变量状态同步**: 变量管理器数据与会话管理器实时同步,无延迟
|
||||
- ✅ **数据刷新优化**: 打开变量管理器时强制刷新,确保数据最新
|
||||
- ✅ **焦点变量功能**: 点击缺失变量自动打开编辑界面,提升效率
|
||||
- ✅ **设置持久化**: 高级模式设置跨会话保存,用户体验一致
|
||||
- ✅ **事件链完整性**: 从点击缺失变量到完成编辑的完整流程验证
|
||||
|
||||
#### 界面重新设计验证 (2025-01-25)
|
||||
- ✅ **基础模式界面**: 完全保持原有UI和功能,只多一个导航按钮
|
||||
- ✅ **高级模式导航**: "🚀 高级模式"按钮正确显示和切换状态
|
||||
- ✅ **变量管理弹窗**: "📊 变量管理"按钮在高级模式下正常显示和工作
|
||||
- ✅ **占位符显示**: 结果区域正确显示"暂无内容"占位符
|
||||
- ✅ **模型选择**: 基础和高级模式下模型选择都正常工作
|
||||
- ✅ **向后兼容性**: 基础模式的所有原有功能完全保持不变
|
||||
|
||||
#### 动态功能测试
|
||||
- ✅ **变量管理**: 5个变量(3个预定义+2个自定义)正常工作
|
||||
- ✅ **会话管理**: 2条消息成功编辑和预览
|
||||
- ✅ **API集成**: 与Gemini 2.0 Flash模型成功通信
|
||||
- ✅ **流式响应**: 完整的流式测试响应正常
|
||||
|
||||
#### 性能测试结果
|
||||
| 性能指标 | 目标值 | 实际值 | 状态 |
|
||||
|----------|--------|--------|------|
|
||||
| 应用启动时间 | <5秒 | ~3秒 | ✅ 优秀 |
|
||||
| 界面响应时间 | <200ms | <100ms | ✅ 优秀 |
|
||||
| 模式切换时间 | <500ms | 即时 | ✅ 优秀 |
|
||||
| 内存使用 | 正常范围 | 稳定 | ✅ 正常 |
|
||||
|
||||
### 手动验证测试 ✅
|
||||
```
|
||||
测试数据:
|
||||
- 自定义变量: userInput="Hello, how can you help me?"
|
||||
- 自定义变量: systemRole="You are a helpful assistant"
|
||||
- 测试消息: 2条(system角色 + user角色)
|
||||
- 变量替换: {{systemRole}} 和 {{userInput}} 正常替换
|
||||
```
|
||||
|
||||
**测试结果**:
|
||||
- 变量CRUD操作: ✅ 完全正常
|
||||
- 消息编辑功能: ✅ 完全正常
|
||||
- 变量预览功能: ✅ 实时更新
|
||||
- 缺失变量检测: ✅ 智能提示
|
||||
- 测试执行流程: ✅ 端到端成功
|
||||
|
||||
## 📊 项目统计数据
|
||||
|
||||
### 代码贡献统计
|
||||
| 分类 | 新增文件 | 修改文件 | 代码行数 | 测试覆盖 |
|
||||
|------|----------|----------|----------|----------|
|
||||
| 核心服务 | 3个 | 2个 | ~300行 | 90%+ |
|
||||
| UI组件 | 7个 | 2个 | ~1300行 | 80%+ |
|
||||
| 类型定义 | 2个 | 1个 | ~150行 | 100% |
|
||||
| 国际化文本 | 2个 | 0个 | ~60行 | 100% |
|
||||
| 测试代码 | 1个 | 0个 | ~200行 | - |
|
||||
| **总计** | **15个** | **5个** | **~2010行** | **85%+** |
|
||||
|
||||
### 2025-08-26界面优化修复统计
|
||||
| 修复项 | 涉及文件 | 修改行数 | 说明 |
|
||||
|--------|----------|----------|------|
|
||||
| 主题CSS集成 | ConversationManager.vue | ~15行 | 添加消息区域使用主题样式 |
|
||||
| 变量状态同步 | AdvancedTestPanel.vue | ~25行 | 统一变量管理器实例 |
|
||||
| 数据刷新优化 | VariableManagerModal.vue | ~20行 | 焦点变量功能实现 |
|
||||
| 设置持久化 | App.vue | ~30行 | 高级模式设置永久保存 |
|
||||
| **修复总计** | **4个文件** | **~90行** | **4个关键问题解决** |
|
||||
|
||||
### 2025-01-25重新设计统计
|
||||
| 组件 | 状态 | 代码行数 | 说明 |
|
||||
|------|------|----------|------|
|
||||
| VariableManagerModal | ✅ 完成 | ~600行 | 独立变量管理弹窗 |
|
||||
| 导航菜单集成 | ✅ 完成 | ~50行 | 高级模式导航按钮实现 |
|
||||
| 国际化更新 | ✅ 完成 | ~10行 | 新增导航菜单翻译 |
|
||||
| 测试面板修复 | ✅ 完成 | ~30行 | 修复基础模式使用正确的TestPanelUI |
|
||||
| 模型选择修复 | ✅ 完成 | ~20行 | 修复基础模式模型选择默认值问题 |
|
||||
|
||||
### 构建和部署结果
|
||||
```
|
||||
✅ Core包构建: 成功,0错误,0警告
|
||||
✅ UI包构建: 成功,0错误,0警告
|
||||
✅ Web包构建: 成功,0错误,0警告
|
||||
✅ Extension包构建: 成功,0错误,0警告
|
||||
✅ Desktop包构建: 成功,IPC接口修复完成
|
||||
|
||||
测试结果:
|
||||
✅ Core包测试: 357个测试通过
|
||||
✅ UI包测试: 35个测试通过
|
||||
✅ 类型检查: 所有新增类型定义正确
|
||||
✅ ESLint检查: 代码风格符合规范
|
||||
```
|
||||
|
||||
## 💡 关键成功因素
|
||||
|
||||
### 1. 架构设计优势
|
||||
- **向后兼容策略**: 使用可选字段扩展,确保现有功能不受影响
|
||||
- **模块化设计**: 组件职责清晰,易于测试和维护
|
||||
- **数据结构统一**: ConversationMessage在优化和测试阶段复用
|
||||
- **服务层解耦**: UI层和Core层职责分离
|
||||
- **渐进式界面设计**: 通过导航菜单集成实现功能的渐进式发现 (2025-01-25新增)
|
||||
|
||||
### 2. 开发过程管理
|
||||
- **阶段化开发**: 4个阶段逐步推进,风险可控
|
||||
- **持续集成**: 每个阶段都进行构建和测试验证
|
||||
- **文档驱动**: 详细的设计文档指导开发过程
|
||||
- **自动化测试**: 使用Playwright MCP进行端到端验证
|
||||
|
||||
### 3. 技术实现亮点
|
||||
- **CSP安全保证**: 复用现有CSPSafeTemplateProcessor确保安全
|
||||
- **状态管理优化**: 响应式状态、本地持久化、错误恢复
|
||||
- **用户体验优化**: 智能切换、实时预览、友好提示
|
||||
- **类型安全**: 完整的TypeScript类型支持
|
||||
- **导航菜单集成**: 高级模式作为导航按钮,变量管理独立弹窗 (2025-01-25新增)
|
||||
|
||||
## 🔍 经验总结和最佳实践
|
||||
|
||||
### 技术经验
|
||||
1. **接口扩展最佳实践**: 使用可选字段而非新接口,保持向后兼容
|
||||
2. **组件设计模式**: 功能内聚、接口简洁、状态可预测
|
||||
3. **测试驱动开发**: 先写接口定义,再实现功能,最后验证测试
|
||||
4. **渐进式增强**: 基础功能稳定后再添加高级功能
|
||||
|
||||
### 项目管理经验
|
||||
1. **需求确认重要性**: 详细的需求分析避免了后期大幅修改
|
||||
2. **阶段化开发价值**: 每个阶段都有明确目标和验收标准
|
||||
3. **文档先行原则**: 设计文档指导开发,减少返工
|
||||
4. **自动化测试必要性**: 确保每次修改都不会破坏现有功能
|
||||
|
||||
### 避坑指南
|
||||
1. **接口变更风险**: 扩展接口比重新设计接口更安全
|
||||
2. **状态管理复杂度**: 明确状态归属,避免多点修改
|
||||
3. **组件耦合问题**: 通过服务层解耦,而非直接组件通信
|
||||
4. **性能优化时机**: 功能完成后再优化,避免过早优化
|
||||
|
||||
## 📚 开发过程中的关键问题解决记录
|
||||
|
||||
### 阶段1: 初始功能开发问题 (2025-01-23)
|
||||
|
||||
#### 问题1: VariableManagerModal组件接口类型不匹配
|
||||
**问题描述**: 点击变量管理按钮出现 `TypeError: n.variableManager.variableManager.resolveAllVariables is not a function`
|
||||
**根本原因**: VariableManagerModal组件期望的是 `IVariableManager` 接口,但实际传入的是 `VariableManagerHooks` 类型
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 修复前 - 错误的类型定义
|
||||
interface Props {
|
||||
variableManager: IVariableManager | null // ❌ 错误
|
||||
}
|
||||
|
||||
// 修复后 - 正确的类型定义
|
||||
interface Props {
|
||||
variableManager: VariableManagerHooks | null // ✅ 正确
|
||||
}
|
||||
```
|
||||
|
||||
#### 问题2: 方法调用嵌套访问错误
|
||||
**问题描述**: `resolveAllVariables` 方法需要嵌套访问 `variableManager.variableManager.resolveAllVariables`
|
||||
**解决方案**: 统一接口调用方式,避免多层嵌套访问
|
||||
```typescript
|
||||
// 修复前
|
||||
const variables = props.variableManager.variableManager.resolveAllVariables(context)
|
||||
|
||||
// 修复后
|
||||
const variables = props.variableManager.resolveAllVariables(context)
|
||||
```
|
||||
|
||||
### 阶段2: 界面重新设计挑战 (2025-01-25)
|
||||
|
||||
#### 问题1: 基础模式使用了错误的测试面板组件
|
||||
**问题描述**: 基础模式下显示了高级功能,破坏了向后兼容性
|
||||
**解决方案**: 修复组件导入和使用,确保基础模式使用 `TestPanelUI` 而非 `AdvancedTestPanel`
|
||||
|
||||
#### 问题2: 模型选择默认值和占位符显示问题
|
||||
**问题描述**: 基础模式下模型选择组件显示异常
|
||||
**解决方案**: 重新验证和修复所有基础模式的UI组件行为
|
||||
|
||||
### 阶段3: 用户提示词优化模式开发 (2025-08-27)
|
||||
|
||||
#### 问题1: 两种优化模式使用相同UI逻辑的不合理性
|
||||
**问题背景**: 用户提示词模式下仍显示测试内容输入框,但实际不需要额外的测试内容输入
|
||||
**技术挑战**:
|
||||
- 需要在单个组件中根据优化模式进行条件渲染
|
||||
- 变量系统需要根据模式提供不同的变量集合
|
||||
- 验证逻辑需要根据模式调整验证规则
|
||||
|
||||
**解决方案**:
|
||||
```vue
|
||||
<!-- 条件渲染逻辑 -->
|
||||
<div v-if="optimizationMode === 'system'" class="mb-4">
|
||||
<textarea v-model="testContent" ... />
|
||||
</div>
|
||||
|
||||
<!-- 变量系统优化 -->
|
||||
const allVariables = computed(() => {
|
||||
if (props.optimizationMode === 'system') {
|
||||
return variableManager.value.resolveAllVariables({
|
||||
...baseContext,
|
||||
userQuestion: testContent.value || ''
|
||||
})
|
||||
} else {
|
||||
return variableManager.value.resolveAllVariables(baseContext)
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
#### 问题2: 快速模板需要区分优化模式
|
||||
**解决方案**: 实现了基于优化模式和语言的动态模板加载系统,为不同优化模式提供专用的快速模板
|
||||
|
||||
### 阶段4: Apply to Test 功能增强 (2025-08-27)
|
||||
|
||||
#### 用户反馈问题: "应用到测试按钮好像无效了"
|
||||
**核心问题**: 原有实现只是启用高级模式,没有提供实质性的测试配置功能
|
||||
**创新解决方案**:
|
||||
- 转变为智能会话模板配置系统
|
||||
- 根据优化模式自动创建合适的测试环境
|
||||
- 引入 `{{currentPrompt}}` 变量支持灵活的提示词切换
|
||||
|
||||
**技术实现**:
|
||||
```typescript
|
||||
// 智能模板生成逻辑
|
||||
if (optimizationData.optimizationMode === 'system') {
|
||||
// 系统提示词优化:系统消息 + 用户交互消息
|
||||
conversationMessages.value = [
|
||||
{ role: 'system', content: '{{currentPrompt}}' },
|
||||
{ role: 'user', content: '请按照你的角色设定,展示你的能力并与我互动。' }
|
||||
]
|
||||
} else {
|
||||
// 用户提示词优化:仅用户消息
|
||||
conversationMessages.value = [
|
||||
{ role: 'user', content: '{{currentPrompt}}' }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 阶段5: 优化阶段变量集成探索 (设计阶段)
|
||||
|
||||
#### 前瞻性设计思考: 优化阶段的上下文集成
|
||||
**设计目标**: 让LLM能够基于完整上下文(变量+会话+优化目标)进行智能优化
|
||||
**典型用户场景**:
|
||||
```
|
||||
用户要优化客服机器人:
|
||||
1. 设置变量:公司名称 = "ABC科技", 业务类型 = "软件服务"
|
||||
2. 编辑优化目标:"让这个{{公司名称}}的客服助手回复更专业"
|
||||
3. 定义会话上下文:
|
||||
System: "你是{{公司名称}}的{{业务类型}}客服助手"
|
||||
User: "{{用户问题}}"
|
||||
Assistant: "感谢您的咨询" [这里需要优化]
|
||||
4. LLM收到完整上下文,优化出专业的回复
|
||||
```
|
||||
|
||||
**技术架构思考**:
|
||||
- 扩展 OptimizationRequest 接口支持变量和会话上下文
|
||||
- 在优化调用前进行变量预处理和模板渲染
|
||||
- 保持向后兼容,新功能作为可选增强
|
||||
|
||||
### 关键成功因素总结
|
||||
|
||||
1. **用户反馈驱动**: 每个重大改进都源于真实的用户反馈和需求
|
||||
2. **向后兼容优先**: 始终确保新功能不破坏现有用户体验
|
||||
3. **渐进式增强**: 通过可选功能和智能默认值实现功能的平滑升级
|
||||
4. **模式差异化**: 认识到不同使用场景需要不同的交互设计
|
||||
5. **组件化思维**: 通过组件复用和服务层解耦实现可维护的架构
|
||||
|
||||
### 技术债务和改进空间
|
||||
|
||||
1. **性能优化空间**: 大量变量时的渲染优化仍有提升空间
|
||||
2. **边缘案例处理**: 特殊字符、超长文本等边缘情况需要更完善的处理
|
||||
3. **用户体验细节**: 更多智能默认值和快捷操作可以进一步提升效率
|
||||
4. **测试覆盖**: 虽然达到85%+覆盖率,但复杂交互场景的测试仍可加强
|
||||
|
||||
## 🚀 项目价值和影响
|
||||
|
||||
### 用户价值
|
||||
- **普通用户**: 保持原有简单体验,可选择使用高级功能
|
||||
- **高级用户**: 获得强大的变量管理和复杂对话测试能力
|
||||
- **开发者**: 清晰的架构扩展模式,便于后续功能开发
|
||||
|
||||
### 技术价值
|
||||
- **架构演进**: 为系统提供了可扩展的高级功能架构
|
||||
- **代码质量**: 提升了整体代码的类型安全性和可维护性
|
||||
- **开发效率**: 建立了组件化开发和测试的最佳实践
|
||||
|
||||
### 业务价值
|
||||
- **功能完整性**: 显著增强了系统的功能覆盖面
|
||||
- **用户满意度**: 提供了更灵活强大的提示词测试能力
|
||||
- **竞争优势**: 在提示词优化工具中建立了功能领先地位
|
||||
|
||||
## 🔮 后续建议
|
||||
|
||||
### 短期优化 (1-2周)
|
||||
- [x] **界面重新设计**: 将变量管理改为独立弹窗,高级模式改为导航菜单按钮
|
||||
- [ ] **性能优化**: 大量变量时的渲染性能优化
|
||||
- [ ] **UX优化**: 添加更多快捷操作和智能默认值
|
||||
- [ ] **边缘案例**: 处理特殊字符、超长文本等边缘情况
|
||||
|
||||
### 中期发展 (1-2月)
|
||||
- [ ] **模板系统**: 支持预设的变量和对话模板
|
||||
- [ ] **使用统计**: 记录变量和会话的使用频率
|
||||
- [ ] **导入导出增强**: 支持更多格式和批量操作
|
||||
|
||||
### 长期愿景 (3-6月)
|
||||
- [ ] **智能推荐**: 基于使用习惯推荐变量和模板
|
||||
- [ ] **可视化编辑**: 拖拽式会话流程设计器
|
||||
- [ ] **协作功能**: 变量和会话的分享和团队协作
|
||||
|
||||
### 2025-01-25重新设计后续计划
|
||||
- [x] **实现导航菜单集成**: 完成高级模式导航按钮的实现
|
||||
- [x] **完成弹窗集成**: 实现变量管理独立弹窗的完整集成
|
||||
- [x] **更新国际化**: 添加导航菜单相关的翻译文本
|
||||
- [x] **用户体验测试**: 验证重新设计后的交互流程
|
||||
- [x] **测试面板修复**: 修复基础模式使用错误的测试面板组件问题
|
||||
- [x] **模型选择修复**: 修复基础模式模型选择默认值和占位符显示问题
|
||||
|
||||
## 📝 项目总结
|
||||
|
||||
本项目圆满完成了所有既定目标,在技术实现、用户体验和项目管理方面都达到了很高的标准。通过渐进式增强的架构设计,我们成功在不影响现有功能的前提下,为系统添加了强大的高级功能。
|
||||
|
||||
**核心成就**:
|
||||
- ✅ 实现了完整的自定义变量管理系统
|
||||
- ✅ 建立了统一的多轮会话测试框架
|
||||
- ✅ 保持了100%的向后兼容性
|
||||
- ✅ 通过了全面的自动化测试验证
|
||||
- ✅ 建立了可扩展的高级功能架构
|
||||
- ✅ 完成了界面重新设计,优化用户体验 (2025-01-25)
|
||||
- ✅ 修复了基础模式测试面板问题,确保原有功能完全不变
|
||||
- ✅ 实现了导航菜单集成,变量管理作为独立弹窗工作
|
||||
- ✅ 验证了所有功能在开发和生产环境中的正常运行
|
||||
|
||||
**项目评级**: 🏆 **优秀** (超预期完成所有目标)
|
||||
|
||||
这个项目为提示词优化系统的后续发展奠定了坚实的基础,同时为团队积累了宝贵的大型功能开发和架构扩展经验。
|
||||
@@ -1,262 +0,0 @@
|
||||
# 高级变量管理功能项目概览
|
||||
|
||||
## 📋 项目信息
|
||||
|
||||
**项目名称**: 高级变量管理功能开发
|
||||
**项目状态**: ✅ 已完成
|
||||
**完成时间**: 2025-01-23
|
||||
**项目目标**: 在现有提示词优化系统基础上,新增高级模式功能,支持自定义变量管理和多轮会话测试
|
||||
|
||||
## 🎯 项目目标与价值
|
||||
|
||||
### 主要目标
|
||||
- 在保持100%向后兼容的前提下,为用户提供高级模式功能
|
||||
- 支持自定义变量的创建、编辑、删除管理
|
||||
- 实现统一的会话管理,支持多轮对话测试
|
||||
- 提供变量预览、缺失检测等用户友好功能
|
||||
|
||||
### 用户价值
|
||||
- **普通用户**: 保持简单的基础模式体验,可选择渐进增强
|
||||
- **高级用户**: 获得完全控制的变量管理和复杂对话测试能力
|
||||
- **开发者**: 清晰的架构扩展,便于后续功能开发
|
||||
|
||||
### 重新设计要点 (2025-01-25更新)
|
||||
- **变量管理独立弹窗**: 变量管理功能在独立的模态弹窗中打开,不影响主界面
|
||||
- **高级模式导航按钮**: 高级模式切换成为导航菜单中的一个按钮,而非页面开关
|
||||
- **基础模式界面不变**: 基础模式下用户只看到导航菜单多了一个按钮,其他界面保持原样
|
||||
|
||||
## 🏆 核心功能
|
||||
|
||||
### 1. 双模式系统 ✅
|
||||
- **基础模式**: 保持现有简单体验,支持基本的提示词测试
|
||||
- **高级模式**: 通过导航菜单按钮启用,提供变量管理和会话管理功能
|
||||
- **智能切换**: 自动创建默认变量和消息,状态持久化
|
||||
|
||||
### 1.1 提示词优化模式差异化设计 ✅
|
||||
为了提供更合理的用户体验,系统提示词优化和用户提示词优化采用了不同的交互设计:
|
||||
|
||||
#### 系统提示词优化模式:
|
||||
- ✅ 需要测试内容输入框(提供 `{{userQuestion}}` 变量)
|
||||
- ✅ 支持会话管理器(用于构建完整测试场景)
|
||||
- ✅ 变量:`{{currentPrompt}}` + `{{userQuestion}}` + 自定义变量
|
||||
- ✅ 验证:需要检查测试内容和会话消息
|
||||
|
||||
#### 用户提示词优化模式:
|
||||
- ✅ 不需要测试内容输入框(优化后的提示词本身就是完整的用户消息)
|
||||
- ✅ 保留会话管理器(用于添加上下文,如系统消息设定场景)
|
||||
- ✅ 变量:主要是 `{{currentPrompt}}` + 自定义变量
|
||||
- ✅ 验证:只需检查会话消息完整性
|
||||
|
||||
### 2. 重新设计的交互流程 (2025-01-25更新) ✅
|
||||
- **导航菜单集成**: 高级模式作为导航菜单按钮,始终可见但根据状态显示不同样式
|
||||
- **变量管理弹窗**: 变量管理功能在独立模态弹窗中,不影响主界面流程
|
||||
- **渐进式发现**: 基础用户只看到导航菜单多了一个按钮,高级用户可逐步发现更多功能
|
||||
|
||||
### 3. 变量管理系统 ✅
|
||||
- **预定义变量**: 保持现有3个系统变量 (`originalPrompt`, `lastOptimizedPrompt`, `iterateInput`)
|
||||
- **自定义变量**: 用户可创建、编辑、删除自定义变量
|
||||
- **实时统计**: 显示变量总数和使用状态
|
||||
- **导入导出**: 支持批量变量管理
|
||||
|
||||
### 4. 会话管理系统 ✅
|
||||
- **多角色支持**: system、user、assistant角色消息编辑
|
||||
- **变量语法**: 支持 `{{variableName}}` 语法,实时预览替换效果
|
||||
- **智能检测**: 缺失变量检测和快速创建建议
|
||||
- **快速模板**: 预设常用对话模板
|
||||
|
||||
### 5. 测试增强功能 ✅
|
||||
- **自定义会话测试**: 支持完整的多轮对话测试
|
||||
- **流式响应**: 保持现有的流式API调用体验
|
||||
- **错误处理**: 完善的错误提示和恢复机制
|
||||
- **结果预览**: 变量替换前后的内容对比
|
||||
|
||||
## 📊 项目成果
|
||||
|
||||
### 代码统计
|
||||
| 分类 | 文件数 | 代码行数 | 状态 |
|
||||
|------|--------|----------|------|
|
||||
| 核心服务 | 3个 | ~300行 | ✅ 完成 |
|
||||
| UI组件 | 6个 | ~1200行 | ✅ 完成 |
|
||||
| 类型定义 | 2个 | ~150行 | ✅ 完成 |
|
||||
| 国际化 | 2个 | ~50行 | ✅ 完成 |
|
||||
| 测试文件 | 1个 | ~200行 | ✅ 完成 |
|
||||
|
||||
### 性能指标
|
||||
| 指标 | 数值 | 状态 |
|
||||
|------|------|------|
|
||||
| 应用初始化时间 | ~3秒 | ✅ 正常 |
|
||||
| 界面渲染响应 | <100ms | ✅ 流畅 |
|
||||
| 模式切换时间 | 即时 | ✅ 优秀 |
|
||||
| 变量操作响应 | 即时 | ✅ 优秀 |
|
||||
|
||||
### 功能验证结果
|
||||
- ✅ **变量管理**: 5个变量正常工作,CRUD操作完整
|
||||
- ✅ **会话管理**: 2条消息成功测试,角色选择正常
|
||||
- ✅ **高级测试**: Gemini 2.0 Flash模型测试成功,流式响应正常
|
||||
- ✅ **兼容性**: 现有功能100%保持不变
|
||||
|
||||
## 🔧 技术架构
|
||||
|
||||
### 核心设计原则
|
||||
1. **向后兼容优先**: 保持现有API和功能不变
|
||||
2. **渐进式增强**: 通过开关控制高级功能显示
|
||||
3. **统一数据结构**: 使用相同的ConversationMessage结构
|
||||
4. **最小接口修改**: 只扩展必要的接口字段
|
||||
|
||||
### 关键技术决策
|
||||
- **UI层变量管理**: 避免后端复杂度,在前端管理自定义变量
|
||||
- **可选字段扩展**: 通过 `advancedContext?` 可选字段扩展现有接口
|
||||
- **CSP安全保证**: 复用现有 `CSPSafeTemplateProcessor` 确保安全性
|
||||
- **组件化设计**: 模块化UI组件,便于复用和维护
|
||||
|
||||
### 核心组件
|
||||
```
|
||||
AdvancedTestPanel (主组件)
|
||||
├── VariableManagerModal (变量管理弹窗)
|
||||
├── ConversationManager (会话管理)
|
||||
├── BasicTestMode (基础模式封装)
|
||||
└── AdvancedModeNavigation (导航菜单集成)
|
||||
```
|
||||
|
||||
## 🚀 项目里程碑
|
||||
|
||||
### 阶段1: 变量管理基础 ✅ (2025-01-20)
|
||||
- 创建VariableManager服务类
|
||||
- 实现高级模式开关UI
|
||||
- 完成变量CRUD操作
|
||||
|
||||
### 阶段2: 会话管理组件 ✅ (2025-01-20)
|
||||
- 实现ConversationMessageEditor
|
||||
- 添加变量检测和预览功能
|
||||
- 集成快速模板功能
|
||||
|
||||
### 阶段3: 优化阶段集成 ✅ (2025-01-20)
|
||||
- 扩展OptimizationRequest接口
|
||||
- 增强TemplateProcessor处理能力
|
||||
- 完成PromptService集成
|
||||
|
||||
### 阶段4: 界面重新设计 ✅ (2025-01-25)
|
||||
- 将变量管理改为独立弹窗界面
|
||||
- 将高级模式改为导航菜单按钮
|
||||
- 修改基础模式界面显示逻辑
|
||||
- 测试新的交互流程
|
||||
|
||||
## 💡 核心经验总结
|
||||
|
||||
### 成功要素
|
||||
1. **架构设计优势**: 向后兼容、模块化、类型安全、状态管理
|
||||
2. **用户体验优势**: 智能切换、实时反馈、直观操作、错误处理
|
||||
3. **开发者体验优势**: 组件复用、服务解耦、测试覆盖、文档完整
|
||||
|
||||
### 技术亮点
|
||||
- **统一消息结构**: 优化和测试阶段使用相同的ConversationMessage接口
|
||||
- **变量系统集成**: 预定义变量和自定义变量无缝整合
|
||||
- **流式测试支持**: 保持现有流式API体验的同时支持复杂会话
|
||||
- **智能状态管理**: 响应式状态、自动持久化、错误恢复
|
||||
- **渐进式界面设计**: 通过导航菜单集成实现功能的渐进式发现
|
||||
|
||||
## 🔮 后续规划
|
||||
|
||||
### 短期优化建议
|
||||
- 性能优化:大量变量的渲染优化
|
||||
- UX改进:更多快捷操作和智能默认值
|
||||
- 边缘案例:特殊字符、大文本处理
|
||||
|
||||
### 中期发展可能
|
||||
- 模板系统:支持变量的提示词模板
|
||||
- 历史功能:变量和会话的使用历史
|
||||
- 协作功能:变量和会话的分享
|
||||
|
||||
### 长期愿景
|
||||
- 智能建议:基于使用习惯的变量推荐
|
||||
- 可视化编辑:拖拽式会话流程设计
|
||||
- 插件系统:第三方变量处理器支持
|
||||
|
||||
---
|
||||
|
||||
## 📝 使用指南
|
||||
|
||||
### 基础用户
|
||||
1. 保持使用现有的基础模式即可
|
||||
2. 如需高级功能,点击"启用高级功能"开关
|
||||
3. 可选择性地使用变量管理和会话编辑功能
|
||||
|
||||
### 高级用户
|
||||
1. 启用高级模式后,可创建自定义变量
|
||||
2. 使用会话管理器构建复杂的多轮对话
|
||||
3. 利用变量预览功能确保内容正确
|
||||
4. 通过导入导出功能管理变量集合
|
||||
|
||||
---
|
||||
|
||||
## 📝 用户交互和使用说明
|
||||
|
||||
### 基础用户
|
||||
1. **保持原有体验**: 继续使用现有的基础模式即可,界面和功能完全不变
|
||||
2. **可选的高级功能**: 如需高级功能,点击导航菜单中的"🚀 高级模式"按钮
|
||||
3. **渐进式发现**: 可选择性地使用变量管理和会话编辑功能
|
||||
|
||||
### 高级用户
|
||||
|
||||
#### 启用高级模式
|
||||
1. 点击导航菜单中的"🚀 高级模式"按钮
|
||||
2. 界面会显示会话管理区域和相关功能
|
||||
3. 导航菜单会新增"📊 变量管理"按钮
|
||||
|
||||
#### 变量管理使用方法
|
||||
1. **打开变量管理器**: 点击"📊 变量管理"按钮打开独立弹窗
|
||||
2. **查看变量统计**: 显示预定义变量和自定义变量的数量统计
|
||||
3. **添加自定义变量**:
|
||||
- 点击"添加变量"
|
||||
- 输入变量名(只支持字母、数字、下划线)
|
||||
- 输入变量值
|
||||
- 点击"保存"
|
||||
4. **编辑变量**: 点击变量项的编辑按钮进行修改
|
||||
5. **删除变量**: 点击变量项的删除按钮(预定义变量不可删除)
|
||||
6. **导入导出**: 支持JSON格式的批量变量管理
|
||||
|
||||
#### 会话管理使用方法
|
||||
1. **添加消息**: 点击"添加消息"按钮,选择角色类型(System/User/Assistant)
|
||||
2. **编辑消息**: 直接在消息输入框中编辑内容,支持 `{{变量名}}` 语法
|
||||
3. **变量提示**: 系统会自动检测缺失的变量并提供创建建议
|
||||
4. **消息排序**: 使用上下箭头调整消息顺序
|
||||
5. **消息删除**: 点击删除按钮移除不需要的消息
|
||||
6. **实时预览**: 点击预览按钮查看变量替换后的实际内容
|
||||
|
||||
#### 快速模板使用
|
||||
1. **选择模板**: 点击"快速模板"下拉菜单
|
||||
2. **模式区分**:
|
||||
- 系统提示词优化模式:提供6个专用模板(默认测试、角色能力展示等)
|
||||
- 用户提示词优化模式:提供7个专用模板(简单测试、专家模式等)
|
||||
3. **应用模板**: 点击模板名称即可应用到当前会话
|
||||
4. **清空重置**: 使用"清空全部"功能重置会话内容
|
||||
|
||||
#### Apply to Test 功能使用
|
||||
1. **智能配置**: 点击"应用到测试"按钮会根据优化模式自动创建合适的测试环境
|
||||
2. **变量设置**: 自动使用 `{{currentPrompt}}` 变量支持原始/优化提示词切换
|
||||
3. **会话结构**: 根据系统/用户提示词模式创建不同的会话模板
|
||||
|
||||
### 两种优化模式的使用场景
|
||||
|
||||
#### 系统提示词优化
|
||||
- **使用场景**: 优化AI的系统角色设定、行为指南
|
||||
- **操作流程**:
|
||||
1. 在原始提示词框输入系统提示词
|
||||
2. 在测试内容框输入用户问题
|
||||
3. 使用会话管理器构建完整测试场景
|
||||
4. 点击"开始优化"
|
||||
- **变量支持**: `{{currentPrompt}}` + `{{userQuestion}}` + 自定义变量
|
||||
|
||||
#### 用户提示词优化
|
||||
- **使用场景**: 优化用户向AI提出的问题或请求
|
||||
- **操作流程**:
|
||||
1. 在原始提示词框输入用户提示词
|
||||
2. 无需测试内容输入(系统自动隐藏)
|
||||
3. 可在会话管理器中添加系统消息设定场景
|
||||
4. 点击"开始优化"
|
||||
- **变量支持**: 主要使用 `{{currentPrompt}}` + 自定义变量
|
||||
|
||||
### 设置持久化
|
||||
- **高级模式状态**: 启用/关闭状态会自动保存,刷新后保持
|
||||
- **自定义变量**: 自动保存到本地存储,永久可用
|
||||
- **会话内容**: 在当前会话期间保持,刷新后重置
|
||||
@@ -1,77 +0,0 @@
|
||||
# 高级变量管理功能 - 文档集合
|
||||
|
||||
本目录包含高级变量管理功能项目的完整文档,记录了从需求分析、技术实现到项目完成的全过程。
|
||||
|
||||
## 📚 核心文档
|
||||
|
||||
### 1. [PROJECT_OVERVIEW.md](./PROJECT_OVERVIEW.md)
|
||||
**需求分析和功能设计**
|
||||
- 项目目标与用户价值分析
|
||||
- 双模式系统设计理念
|
||||
- 提示词优化模式差异化设计
|
||||
- 完整的用户交互和使用说明
|
||||
- 两种优化模式的使用场景
|
||||
|
||||
### 2. [TECHNICAL_ARCHITECTURE.md](./TECHNICAL_ARCHITECTURE.md)
|
||||
**技术实现和系统架构**
|
||||
- 完整的系统架构设计
|
||||
- 核心接口和数据结构定义
|
||||
- 关键技术决策说明
|
||||
- 组件设计模式和实现细节
|
||||
- Apply to Test 功能架构设计
|
||||
|
||||
### 3. [PROJECT_COMPLETION_REPORT.md](./PROJECT_COMPLETION_REPORT.md)
|
||||
**开发过程和问题解决经验**
|
||||
- 项目完成情况和成果统计
|
||||
- 完整的验证和测试结果
|
||||
- 开发过程中的关键问题解决记录
|
||||
- 技术经验总结和最佳实践
|
||||
- 项目价值评估和后续建议
|
||||
|
||||
### 4. [INTERFACE_OPTIMIZATION_REPORT_2025-08-26.md](./INTERFACE_OPTIMIZATION_REPORT_2025-08-26.md)
|
||||
**最新界面优化修复报告**
|
||||
- 4个关键界面问题的详细修复过程
|
||||
- 主题CSS集成、变量状态同步等技术方案
|
||||
- 用户体验改进前后对比
|
||||
- 修复验证结果和技术亮点
|
||||
|
||||
## 🗺️ 文档阅读指南
|
||||
|
||||
### 快速了解项目
|
||||
**路径**: PROJECT_OVERVIEW.md → 了解项目目标、功能设计和使用方法
|
||||
|
||||
### 技术深入学习
|
||||
**路径**: TECHNICAL_ARCHITECTURE.md → 理解系统架构和技术实现细节
|
||||
|
||||
### 开发经验学习
|
||||
**路径**: PROJECT_COMPLETION_REPORT.md → 学习开发过程中的问题解决经验
|
||||
|
||||
### 最新优化了解
|
||||
**路径**: INTERFACE_OPTIMIZATION_REPORT_2025-08-26.md → 查看最新的界面优化方案
|
||||
|
||||
## 📊 项目总览
|
||||
|
||||
- **项目状态**: ✅ 圆满完成
|
||||
- **完成时间**: 2025-08-27 (最终优化)
|
||||
- **功能完整性**: 100%
|
||||
- **向后兼容性**: 100%
|
||||
- **代码覆盖率**: 85%+
|
||||
|
||||
## 🏆 主要成果
|
||||
|
||||
- ✅ **双模式系统**: 基础模式和高级模式无缝切换
|
||||
- ✅ **变量管理**: 完整的自定义变量CRUD和导入导出功能
|
||||
- ✅ **会话管理**: 多轮对话编辑、变量预览和模板应用
|
||||
- ✅ **模式差异化**: 系统和用户提示词优化的差异化设计
|
||||
- ✅ **界面优化**: 主题集成、状态同步、数据刷新、设置持久化
|
||||
|
||||
## 🔧 技术栈
|
||||
|
||||
- **前端**: Vue 3 + TypeScript + Composition API
|
||||
- **状态管理**: 响应式状态 + 本地存储
|
||||
- **样式**: 统一主题CSS系统
|
||||
- **测试**: Playwright + 单元测试
|
||||
|
||||
---
|
||||
|
||||
这个文档集合为高级变量管理功能提供了完整的技术文档,适合开发者学习项目架构、了解实现细节,以及借鉴开发经验。
|
||||
@@ -1,689 +0,0 @@
|
||||
# 高级变量管理功能 - 技术设计与架构
|
||||
|
||||
## 🏗️ 系统架构
|
||||
|
||||
### 整体架构设计 (2025-01-25更新)
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ UI 层 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ MainLayout (导航菜单集成) │
|
||||
│ ├── AdvancedModeNavigation (模式切换) │
|
||||
│ ├── VariableManagerModal (变量管理弹窗) │
|
||||
│ └── 其他导航按钮 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ 测试面板层 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ AdvancedTestPanel │
|
||||
│ ├── ConversationManager │
|
||||
│ ├── BasicTestMode │
|
||||
│ └── AdvancedModeToggle (已移除) │
|
||||
├─────────────────────────────────────────┤
|
||||
│ 服务层 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ VariableManager (UI服务) │
|
||||
│ ├── 自定义变量 CRUD │
|
||||
│ ├── 预定义变量集成 │
|
||||
│ └── 变量解析和验证 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ 核心层 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ PromptService (扩展) │
|
||||
│ ├── testCustomConversationStream │
|
||||
│ └── OptimizationRequest 扩展 │
|
||||
│ │
|
||||
│ TemplateProcessor (复用) │
|
||||
│ ├── CSP安全变量替换 │
|
||||
│ └── 统一变量处理逻辑 │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 设计原则
|
||||
1. **最小侵入**: 基于现有架构进行最小化扩展
|
||||
2. **职责分离**: UI层管理变量,Core层处理逻辑
|
||||
3. **数据统一**: 使用统一的ConversationMessage结构
|
||||
4. **向后兼容**: 所有新功能都是可选的
|
||||
5. **渐进式发现**: 通过导航菜单集成实现功能的渐进式发现 (2025-01-25新增)
|
||||
|
||||
## 📊 核心接口设计
|
||||
|
||||
### 1. 数据结构定义
|
||||
|
||||
```typescript
|
||||
// 统一的消息结构 - 支持优化和测试两种场景
|
||||
export interface ConversationMessage {
|
||||
role: 'system' | 'user' | 'assistant';
|
||||
content: string; // 支持变量语法 {{variableName}}
|
||||
}
|
||||
|
||||
// 扩展的优化请求接口 - 保持向后兼容
|
||||
export interface OptimizationRequest {
|
||||
optimizationMode: OptimizationMode;
|
||||
targetPrompt: string;
|
||||
templateId?: string;
|
||||
modelKey: string;
|
||||
// 新增:高级模式上下文(可选)
|
||||
advancedContext?: {
|
||||
variables?: Record<string, string>; // 自定义变量
|
||||
messages?: ConversationMessage[]; // 自定义会话消息
|
||||
};
|
||||
}
|
||||
|
||||
// 自定义会话测试请求
|
||||
export interface CustomConversationRequest {
|
||||
modelKey: string;
|
||||
messages: ConversationMessage[]; // 使用相同的消息结构
|
||||
variables: Record<string, string>; // 包含预定义+自定义变量
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 服务接口扩展
|
||||
|
||||
```typescript
|
||||
// UI层变量管理服务
|
||||
export interface IVariableManager {
|
||||
// 变量CRUD操作
|
||||
setVariable(name: string, value: string): void;
|
||||
getVariable(name: string): string | undefined;
|
||||
deleteVariable(name: string): void;
|
||||
listVariables(): Record<string, string>;
|
||||
|
||||
// 变量解析和验证
|
||||
resolveAllVariables(context: TemplateContext): Record<string, string>;
|
||||
validateVariableName(name: string): boolean;
|
||||
scanVariablesInContent(content: string): string[];
|
||||
}
|
||||
|
||||
// 扩展的提示词服务
|
||||
export interface IPromptService {
|
||||
// ... 现有方法保持不变
|
||||
|
||||
// 新增:自定义会话测试方法
|
||||
testCustomConversationStream(
|
||||
request: CustomConversationRequest,
|
||||
callbacks: StreamHandlers
|
||||
): Promise<void>;
|
||||
}
|
||||
```
|
||||
|
||||
## 🎨 UI组件架构
|
||||
|
||||
### 主要组件设计
|
||||
|
||||
#### 1. AdvancedTestPanel (主组件) - 2025-01-25更新
|
||||
```vue
|
||||
<template>
|
||||
<div class="advanced-test-panel">
|
||||
<!-- 基础模式 - 始终显示基础测试功能 -->
|
||||
<BasicTestMode
|
||||
:prompt-service="promptService"
|
||||
:advanced-mode-enabled="advancedModeEnabled"
|
||||
/>
|
||||
|
||||
<!-- 高级模式内容 - 仅在高级模式下显示 -->
|
||||
<div v-if="advancedModeEnabled" class="advanced-mode-content">
|
||||
<!-- 会话管理区域 -->
|
||||
<ConversationManager
|
||||
v-model:messages="conversationMessages"
|
||||
:all-variables="allVariables"
|
||||
/>
|
||||
|
||||
<!-- 测试控制区域 -->
|
||||
<TestControls
|
||||
:model-key="modelKey"
|
||||
:is-testing="isTesting"
|
||||
@start-test="handleStartTest"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
```
|
||||
|
||||
#### 2. MainLayout (导航菜单集成) - 2025-01-25新增
|
||||
```vue
|
||||
<template>
|
||||
<div class="main-layout">
|
||||
<!-- 导航菜单区域 -->
|
||||
<div class="navigation-actions">
|
||||
<!-- 高级模式导航按钮 - 始终显示 -->
|
||||
<ActionButtonUI
|
||||
icon="🚀"
|
||||
:text="$t('nav.advancedMode')"
|
||||
@click="toggleAdvancedMode"
|
||||
:class="{ 'active-button': advancedModeEnabled }"
|
||||
/>
|
||||
|
||||
<!-- 变量管理按钮 - 仅在高级模式下显示 -->
|
||||
<ActionButtonUI
|
||||
v-if="advancedModeEnabled"
|
||||
icon="📊"
|
||||
:text="$t('nav.variableManager')"
|
||||
@click="showVariableManager = true"
|
||||
/>
|
||||
|
||||
<!-- 其他导航按钮... -->
|
||||
</div>
|
||||
|
||||
<!-- 主内容区域 -->
|
||||
<div class="main-content">
|
||||
<AdvancedTestPanel
|
||||
:advanced-mode-enabled="advancedModeEnabled"
|
||||
:services="services"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- 变量管理弹窗 -->
|
||||
<VariableManagerModal
|
||||
v-if="showVariableManager"
|
||||
v-model:visible="showVariableManager"
|
||||
:variable-manager="variableManager"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
```
|
||||
|
||||
#### 3. VariableManagerModal (变量管理弹窗组件) - 2025-01-25更新
|
||||
```vue
|
||||
<template>
|
||||
<div class="variable-manager">
|
||||
<div class="variable-header">
|
||||
<h3>{{ t('variables.title') }}</h3>
|
||||
<div class="variable-stats">
|
||||
{{ t('variables.stats', { total: totalVariables, custom: customVariables.length }) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 变量列表 -->
|
||||
<div class="variable-list">
|
||||
<VariableItem
|
||||
v-for="(value, name) in allVariables"
|
||||
:key="name"
|
||||
:name="name"
|
||||
:value="value"
|
||||
:is-predefined="isPredefinedVariable(name)"
|
||||
@update="updateVariable"
|
||||
@delete="deleteVariable"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- 添加变量 -->
|
||||
<AddVariableForm @add="addVariable" />
|
||||
</div>
|
||||
</template>
|
||||
```
|
||||
|
||||
#### 4. ConversationManager (会话管理组件)
|
||||
```vue
|
||||
<template>
|
||||
<div class="conversation-manager">
|
||||
<div class="conversation-header">
|
||||
<h3>{{ t('conversation.title') }}</h3>
|
||||
<div class="conversation-stats">
|
||||
{{ t('conversation.stats', { count: messages.length }) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 消息列表 -->
|
||||
<div class="message-list">
|
||||
<ConversationMessageEditor
|
||||
v-for="(message, index) in messages"
|
||||
:key="index"
|
||||
:message="message"
|
||||
:variables="allVariables"
|
||||
:missing-variables="getMissingVariables(message.content)"
|
||||
@update="updateMessage(index, $event)"
|
||||
@delete="deleteMessage(index)"
|
||||
@move-up="moveMessage(index, -1)"
|
||||
@move-down="moveMessage(index, 1)"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<div class="conversation-actions">
|
||||
<button @click="addMessage">{{ t('conversation.addMessage') }}</button>
|
||||
<QuickTemplateSelector @select="applyTemplate" />
|
||||
<button @click="showPreview = !showPreview">
|
||||
{{ t('conversation.togglePreview') }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- 预览面板 -->
|
||||
<MessagePreview
|
||||
v-if="showPreview"
|
||||
:messages="messages"
|
||||
:variables="allVariables"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
```
|
||||
|
||||
## ⚙️ 核心实现逻辑
|
||||
|
||||
### 1. 变量管理实现
|
||||
|
||||
```typescript
|
||||
// packages/ui/src/services/VariableManager.ts
|
||||
export class VariableManager implements IVariableManager {
|
||||
private customVariables: Record<string, string> = {};
|
||||
private readonly predefinedVariables = [
|
||||
'originalPrompt',
|
||||
'lastOptimizedPrompt',
|
||||
'iterateInput'
|
||||
];
|
||||
|
||||
constructor(private preferenceService: IPreferenceService) {
|
||||
this.loadCustomVariables();
|
||||
}
|
||||
|
||||
// 变量CRUD操作
|
||||
setVariable(name: string, value: string): void {
|
||||
if (!this.validateVariableName(name)) {
|
||||
throw new Error(`Invalid variable name: ${name}`);
|
||||
}
|
||||
|
||||
this.customVariables[name] = value;
|
||||
this.saveCustomVariables();
|
||||
}
|
||||
|
||||
deleteVariable(name: string): void {
|
||||
if (this.predefinedVariables.includes(name)) {
|
||||
throw new Error('Cannot delete predefined variable');
|
||||
}
|
||||
|
||||
delete this.customVariables[name];
|
||||
this.saveCustomVariables();
|
||||
}
|
||||
|
||||
// 解析所有变量(预定义 + 自定义)
|
||||
resolveAllVariables(context: TemplateContext): Record<string, string> {
|
||||
const predefinedVars = this.extractPredefinedVariables(context);
|
||||
return { ...predefinedVars, ...this.customVariables };
|
||||
}
|
||||
|
||||
// 扫描内容中的变量引用
|
||||
scanVariablesInContent(content: string): string[] {
|
||||
const regex = /\{\{(\w+)\}\}/g;
|
||||
const variables: string[] = [];
|
||||
let match;
|
||||
|
||||
while ((match = regex.exec(content)) !== null) {
|
||||
variables.push(match[1]);
|
||||
}
|
||||
|
||||
return [...new Set(variables)];
|
||||
}
|
||||
|
||||
// 变量名验证
|
||||
validateVariableName(name: string): boolean {
|
||||
return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 会话管理实现
|
||||
|
||||
```typescript
|
||||
// packages/ui/src/composables/useConversationManager.ts
|
||||
export function useConversationManager() {
|
||||
const messages = ref<ConversationMessage[]>([]);
|
||||
const variableManager = inject<VariableManager>('variableManager')!;
|
||||
|
||||
// 添加消息
|
||||
const addMessage = (role: 'system' | 'user' | 'assistant' = 'user') => {
|
||||
messages.value.push({
|
||||
role,
|
||||
content: ''
|
||||
});
|
||||
};
|
||||
|
||||
// 更新消息
|
||||
const updateMessage = (index: number, message: ConversationMessage) => {
|
||||
if (index >= 0 && index < messages.value.length) {
|
||||
messages.value[index] = { ...message };
|
||||
}
|
||||
};
|
||||
|
||||
// 删除消息
|
||||
const deleteMessage = (index: number) => {
|
||||
if (index >= 0 && index < messages.value.length) {
|
||||
messages.value.splice(index, 1);
|
||||
}
|
||||
};
|
||||
|
||||
// 检测缺失变量
|
||||
const getMissingVariables = (content: string): string[] => {
|
||||
const referencedVars = variableManager.scanVariablesInContent(content);
|
||||
const availableVars = Object.keys(variableManager.listVariables());
|
||||
|
||||
return referencedVars.filter(variable => !availableVars.includes(variable));
|
||||
};
|
||||
|
||||
// 预览消息(变量替换后)
|
||||
const previewMessages = (variables: Record<string, string>): ConversationMessage[] => {
|
||||
return messages.value.map(message => ({
|
||||
...message,
|
||||
content: replaceVariables(message.content, variables)
|
||||
}));
|
||||
};
|
||||
|
||||
return {
|
||||
messages,
|
||||
addMessage,
|
||||
updateMessage,
|
||||
deleteMessage,
|
||||
getMissingVariables,
|
||||
previewMessages
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 测试流程实现
|
||||
|
||||
```typescript
|
||||
// packages/core/src/services/prompt/service.ts (扩展)
|
||||
export class PromptService implements IPromptService {
|
||||
// ... 现有方法保持不变
|
||||
|
||||
// 新增:自定义会话流式测试
|
||||
async testCustomConversationStream(
|
||||
request: CustomConversationRequest,
|
||||
callbacks: StreamHandlers
|
||||
): Promise<void> {
|
||||
try {
|
||||
// 1. 验证请求
|
||||
this.validateCustomConversationRequest(request);
|
||||
|
||||
// 2. 解析变量
|
||||
const processedMessages = this.processMessagesVariables(
|
||||
request.messages,
|
||||
request.variables
|
||||
);
|
||||
|
||||
// 3. 规范化角色
|
||||
const normalizedMessages = this.normalizeMessageRoles(processedMessages);
|
||||
|
||||
// 4. 调用LLM服务
|
||||
await this.llmService.streamChatCompletion({
|
||||
modelKey: request.modelKey,
|
||||
messages: normalizedMessages,
|
||||
onProgress: callbacks.onProgress,
|
||||
onComplete: callbacks.onComplete,
|
||||
onError: callbacks.onError
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
callbacks.onError?.(error as Error);
|
||||
}
|
||||
}
|
||||
|
||||
// 处理消息中的变量
|
||||
private processMessagesVariables(
|
||||
messages: ConversationMessage[],
|
||||
variables: Record<string, string>
|
||||
): ConversationMessage[] {
|
||||
return messages.map(message => ({
|
||||
...message,
|
||||
content: this.templateProcessor.replaceVariables(message.content, variables)
|
||||
}));
|
||||
}
|
||||
|
||||
// 规范化消息角色 (ai -> assistant)
|
||||
private normalizeMessageRoles(
|
||||
messages: ConversationMessage[]
|
||||
): ConversationMessage[] {
|
||||
return messages.map(message => ({
|
||||
...message,
|
||||
role: message.role === 'ai' ? 'assistant' : message.role
|
||||
})) as ConversationMessage[];
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🔧 关键技术决策
|
||||
|
||||
### 1. 接口扩展策略
|
||||
**决策**: 使用可选字段扩展现有接口
|
||||
```typescript
|
||||
// 扩展而非重写
|
||||
interface OptimizationRequest {
|
||||
// ... 现有字段保持不变
|
||||
advancedContext?: { // 可选字段,保持向后兼容
|
||||
variables?: Record<string, string>;
|
||||
messages?: ConversationMessage[];
|
||||
};
|
||||
}
|
||||
```
|
||||
**优势**: 保持向后兼容,现有代码无需修改
|
||||
|
||||
### 2. 变量管理位置
|
||||
**决策**: UI层管理自定义变量,Core层处理预定义变量
|
||||
**理由**:
|
||||
- 避免后端复杂度
|
||||
- 用户自定义变量本质上是前端配置
|
||||
- 保持Core层的纯净性
|
||||
|
||||
### 3. 消息结构统一
|
||||
**决策**: 优化和测试阶段使用相同的ConversationMessage结构
|
||||
**优势**:
|
||||
- 减少类型复杂度
|
||||
- 组件可复用
|
||||
- 用户理解一致
|
||||
|
||||
### 4. CSP安全保证
|
||||
**决策**: 复用现有CSPSafeTemplateProcessor
|
||||
**实现**:
|
||||
```typescript
|
||||
// 复用现有安全机制
|
||||
const processedContent = this.templateProcessor.replaceVariables(
|
||||
message.content,
|
||||
variables
|
||||
);
|
||||
```
|
||||
|
||||
### 5. 导航菜单集成策略 (2025-01-25新增)
|
||||
**决策**: 将高级模式切换集成到导航菜单,变量管理改为独立弹窗
|
||||
**实现**:
|
||||
```typescript
|
||||
// 导航菜单状态管理
|
||||
const advancedModeEnabled = ref(false)
|
||||
const showVariableManager = ref(false)
|
||||
|
||||
// 交互逻辑
|
||||
const toggleAdvancedMode = () => {
|
||||
advancedModeEnabled.value = !advancedModeEnabled.value
|
||||
}
|
||||
|
||||
const openVariableManager = () => {
|
||||
showVariableManager.value = true
|
||||
}
|
||||
```
|
||||
**优势**:
|
||||
- 基础模式下界面几乎不变
|
||||
- 渐进式功能发现
|
||||
- 独立的变量管理界面
|
||||
|
||||
### 6. 变量状态同步策略 (2025-08-26新增)
|
||||
**决策**: 使用统一的变量管理器实例,避免多实例导致的数据不同步
|
||||
**问题**: AdvancedTestPanel 创建独立的变量管理器实例,导致与主应用实例数据不同步
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 在AdvancedTestPanel中优先使用传入的变量管理器实例
|
||||
const variableManager: Ref<VariableManagerHooks | null> = computed(() => {
|
||||
if (props.variableManager) {
|
||||
return props.variableManager // 使用App.vue传入的统一实例
|
||||
}
|
||||
return localVariableManager // 后备方案:本地实例
|
||||
})
|
||||
```
|
||||
**技术实现**:
|
||||
- App.vue 将其变量管理器实例传递给所有子组件
|
||||
- 所有组件使用相同的变量管理器实例
|
||||
- 确保变量数据的实时同步和一致性
|
||||
|
||||
### 7. 主题CSS集成策略 (2025-08-26新增)
|
||||
**决策**: 统一使用项目的主题CSS系统,避免硬编码样式
|
||||
**实现**:
|
||||
```typescript
|
||||
// 使用主题管理器类替换硬编码样式
|
||||
<div class="add-message-row theme-manager-card">
|
||||
<button class="add-message-btn theme-manager-button-secondary">
|
||||
添加消息
|
||||
</button>
|
||||
</div>
|
||||
```
|
||||
**优势**:
|
||||
- 保持UI风格一致性
|
||||
- 支持主题切换
|
||||
- 减少维护成本
|
||||
|
||||
### 8. 设置持久化策略 (2025-08-26新增)
|
||||
**决策**: 使用项目统一的 preferenceService 进行设置持久化
|
||||
**实现**:
|
||||
```typescript
|
||||
// 高级模式状态持久化
|
||||
const loadAdvancedModeSetting = async () => {
|
||||
if (services.value?.preferenceService) {
|
||||
const saved = await services.value.preferenceService.get('advancedModeEnabled', false)
|
||||
advancedModeEnabled.value = saved
|
||||
}
|
||||
}
|
||||
|
||||
const saveAdvancedModeSetting = async (enabled: boolean) => {
|
||||
if (services.value?.preferenceService) {
|
||||
await services.value.preferenceService.set('advancedModeEnabled', enabled)
|
||||
}
|
||||
}
|
||||
```
|
||||
**优势**:
|
||||
- 用户设置在重启后保持
|
||||
- 使用统一的存储机制
|
||||
- 支持跨平台数据同步
|
||||
|
||||
## 🧪 测试策略
|
||||
|
||||
### 单元测试覆盖
|
||||
```typescript
|
||||
// 变量管理器测试
|
||||
describe('VariableManager', () => {
|
||||
it('should handle custom variables CRUD', () => {
|
||||
// 测试自定义变量的增删改查
|
||||
});
|
||||
|
||||
it('should integrate with predefined variables', () => {
|
||||
// 测试与预定义变量的集成
|
||||
});
|
||||
|
||||
it('should validate variable names', () => {
|
||||
// 测试变量名验证逻辑
|
||||
});
|
||||
});
|
||||
|
||||
// 会话管理测试
|
||||
describe('ConversationManager', () => {
|
||||
it('should detect missing variables', () => {
|
||||
// 测试缺失变量检测
|
||||
});
|
||||
|
||||
it('should preview variable replacement', () => {
|
||||
// 测试变量替换预览
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 集成测试验证
|
||||
- 完整的变量管理流程测试
|
||||
- 会话编辑到测试的端到端流程
|
||||
- 不同模式之间的切换测试
|
||||
- 错误处理和恢复测试
|
||||
|
||||
## 📈 性能考虑
|
||||
|
||||
### 优化点
|
||||
1. **变量扫描缓存**: 避免重复的正则表达式匹配
|
||||
2. **组件懒加载**: 高级模式组件按需加载
|
||||
3. **状态更新节流**: 避免频繁的存储写入
|
||||
4. **虚拟滚动**: 大量变量时的列表渲染优化
|
||||
|
||||
### 内存管理
|
||||
```typescript
|
||||
// 组件卸载时清理监听器
|
||||
onUnmounted(() => {
|
||||
// 清理变量管理器的事件监听
|
||||
variableManager.removeAllListeners();
|
||||
|
||||
// 清理会话管理器的状态
|
||||
conversationManager.cleanup();
|
||||
});
|
||||
```
|
||||
|
||||
## 🔒 安全考虑
|
||||
|
||||
### 1. 变量注入安全
|
||||
- 所有变量替换都通过CSPSafeTemplateProcessor处理
|
||||
- 防止XSS攻击和代码注入
|
||||
- 变量名和值的严格验证
|
||||
|
||||
### 2. 数据存储安全
|
||||
- 自定义变量存储在本地LocalStorage
|
||||
- 敏感信息不包含在变量系统中
|
||||
- 定期清理无效的变量数据
|
||||
|
||||
### 9. Apply to Test 功能架构设计 (2025-08-27新增)
|
||||
**决策**: 将"应用到测试"从简单高级模式启用转变为智能测试配置系统
|
||||
**问题背景**:
|
||||
- 用户反馈原有功能只是启用高级模式,缺乏实际价值
|
||||
- 需要根据优化模式智能创建合适的测试环境
|
||||
|
||||
**技术架构**:
|
||||
```typescript
|
||||
// 核心变量系统扩展
|
||||
export const PREDEFINED_VARIABLES = [
|
||||
'originalPrompt',
|
||||
'lastOptimizedPrompt',
|
||||
'iterateInput',
|
||||
'currentPrompt' // 测试阶段使用的当前提示词变量
|
||||
] as const;
|
||||
|
||||
// 智能模板配置方法
|
||||
const applyOptimizedPromptToTest = (optimizationData: {
|
||||
originalPrompt: string
|
||||
optimizedPrompt: string
|
||||
optimizationMode: string
|
||||
}) => {
|
||||
if (optimizationData.optimizationMode === 'system') {
|
||||
// 系统提示词优化:系统消息 + 用户交互消息
|
||||
conversationMessages.value = [
|
||||
{ role: 'system', content: '{{currentPrompt}}' },
|
||||
{ role: 'user', content: '请按照你的角色设定,展示你的能力并与我互动。' }
|
||||
]
|
||||
} else {
|
||||
// 用户提示词优化:仅用户消息
|
||||
conversationMessages.value = [
|
||||
{ role: 'user', content: '{{currentPrompt}}' }
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
// 组件通信实现
|
||||
const handleApplyToTest = () => {
|
||||
// 自动启用高级模式
|
||||
if (!advancedModeEnabled.value) {
|
||||
advancedModeEnabled.value = true
|
||||
saveAdvancedModeSetting(true)
|
||||
}
|
||||
|
||||
// 调用高级测试面板的配置方法
|
||||
nextTick(() => {
|
||||
advancedTestPanel.applyOptimizedPromptToTest({
|
||||
originalPrompt: optimizer.prompt,
|
||||
optimizedPrompt: optimizer.optimizedPrompt,
|
||||
optimizationMode: selectedOptimizationMode.value
|
||||
})
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
**优势**:
|
||||
- 智能生成测试模板,节省用户配置时间
|
||||
- 模式感知配置,提供最佳测试场景
|
||||
- 统一变量系统,支持灵活的提示词切换
|
||||
@@ -1,394 +0,0 @@
|
||||
# 工具调用功能完整实现报告
|
||||
|
||||
## 📅 实施时间
|
||||
**开始**: 2025-08-28
|
||||
**完成**: 2025-08-28
|
||||
**状态**: ✅ 完全实现并测试通过
|
||||
|
||||
## 📋 项目概述
|
||||
|
||||
基于用户需求:"请你使用mcp工具在浏览器上完成带工具调用的提示词优化和测试,你设计一个合适的例子",成功实现了完整的工具调用功能,包括:
|
||||
|
||||
1. **核心服务层**: OpenAI和Gemini的工具调用支持
|
||||
2. **UI集成**: 工具管理界面和同步机制
|
||||
3. **端到端测试**: MCP工具演示完整workflow
|
||||
4. **构建修复**: TypeScript类型安全问题解决
|
||||
|
||||
## 🎯 完成的核心功能
|
||||
|
||||
### 1. **LLM服务工具调用支持**
|
||||
|
||||
#### 1.1 OpenAI工具调用实现
|
||||
```typescript
|
||||
// packages/core/src/services/llm/service.ts
|
||||
async streamOpenAIMessageWithTools(
|
||||
messages: Message[],
|
||||
modelConfig: ModelConfig,
|
||||
tools: ToolDefinition[],
|
||||
callbacks: StreamHandlers
|
||||
): Promise<void> {
|
||||
const completionConfig: any = {
|
||||
model: modelConfig.defaultModel,
|
||||
messages: formattedMessages,
|
||||
tools: tools,
|
||||
tool_choice: 'auto',
|
||||
stream: true,
|
||||
...restLlmParams
|
||||
};
|
||||
|
||||
// 处理工具调用delta
|
||||
const toolCallDeltas = chunk.choices[0]?.delta?.tool_calls;
|
||||
if (toolCallDeltas) {
|
||||
for (const toolCallDelta of toolCallDeltas) {
|
||||
// ... delta处理逻辑
|
||||
if (callbacks.onToolCall) {
|
||||
callbacks.onToolCall(currentToolCall);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 1.2 Gemini工具调用实现 (关键创新)
|
||||
```typescript
|
||||
async streamGeminiMessageWithTools(
|
||||
messages: Message[],
|
||||
modelConfig: ModelConfig,
|
||||
tools: ToolDefinition[],
|
||||
callbacks: StreamHandlers
|
||||
): Promise<void> {
|
||||
// 转换工具格式为Gemini标准
|
||||
const geminiTools = this.convertToGeminiTools(tools);
|
||||
|
||||
const chatOptions: any = {
|
||||
history: this.formatGeminiHistory(conversationMessages),
|
||||
tools: geminiTools
|
||||
};
|
||||
|
||||
// 处理Gemini工具调用
|
||||
const functionCalls = chunk.functionCalls();
|
||||
if (functionCalls && functionCalls.length > 0) {
|
||||
for (const functionCall of functionCalls) {
|
||||
const toolCall: ToolCall = {
|
||||
id: `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
|
||||
type: 'function' as const,
|
||||
function: {
|
||||
name: functionCall.name,
|
||||
arguments: JSON.stringify(functionCall.args)
|
||||
}
|
||||
};
|
||||
|
||||
if (callbacks.onToolCall) {
|
||||
callbacks.onToolCall(toolCall);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private convertToGeminiTools(tools: ToolDefinition[]): any[] {
|
||||
return [{
|
||||
functionDeclarations: tools.map(tool => ({
|
||||
name: tool.function.name,
|
||||
description: tool.function.description,
|
||||
parameters: tool.function.parameters
|
||||
}))
|
||||
}];
|
||||
}
|
||||
```
|
||||
|
||||
### 2. **UI工具管理完整实现**
|
||||
|
||||
#### 2.1 ContextEditor工具管理面板
|
||||
```vue
|
||||
<!-- 工具管理面板 -->
|
||||
<div v-if="tools.length > 0 || showToolsPanel" class="tools-panel">
|
||||
<div class="tools-header flex items-center justify-between mb-3">
|
||||
<div class="flex items-center gap-3">
|
||||
<h4 class="text-base font-semibold theme-manager-text">工具定义</h4>
|
||||
<span class="text-xs theme-manager-text-secondary px-2 py-0.5 theme-manager-tag rounded">
|
||||
{{ tools.length }} 个工具
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<button @click="addNewTool" class="px-3 py-1.5 text-xs theme-manager-button-primary">
|
||||
添加工具
|
||||
</button>
|
||||
<button @click="toggleToolsPanel" class="px-2 py-1.5 text-xs theme-manager-button-secondary">
|
||||
<!-- 折叠/展开图标 -->
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 工具列表和编辑器 -->
|
||||
<div v-if="showToolsPanel" class="tools-content space-y-3">
|
||||
<!-- 工具项展示 -->
|
||||
<!-- 工具编辑对话框 -->
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
#### 2.2 内置工具示例
|
||||
```typescript
|
||||
const resetToolEditor = () => {
|
||||
editingTool.value = {
|
||||
type: 'function',
|
||||
function: {
|
||||
name: 'get_weather',
|
||||
description: 'Get current weather information for a specific location',
|
||||
parameters: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
location: {
|
||||
type: 'string',
|
||||
description: 'The location to get weather for (e.g., "Beijing", "New York")'
|
||||
},
|
||||
unit: {
|
||||
type: 'string',
|
||||
enum: ['celsius', 'fahrenheit'],
|
||||
description: 'Temperature unit',
|
||||
default: 'celsius'
|
||||
}
|
||||
},
|
||||
required: ['location']
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. **ConversationManager工具统计显示**
|
||||
```vue
|
||||
<!-- 工具数量统计 -->
|
||||
<span
|
||||
class="flex items-center gap-1 cursor-help"
|
||||
:title="currentTools.length > 0 ? `使用的工具: ${currentTools.map(t => t.function.name).join(', ')}` : '暂无使用工具'"
|
||||
>
|
||||
<svg class="w-3 h-3 text-green-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<!-- 工具图标 -->
|
||||
</svg>
|
||||
工具: {{ currentTools.length }}
|
||||
</span>
|
||||
```
|
||||
|
||||
### 4. **工具同步机制实现**
|
||||
|
||||
#### 4.1 AdvancedTestPanel工具同步
|
||||
```typescript
|
||||
// 🆕 处理工具更新(向后兼容)
|
||||
const handleToolsUpdate = (tools: ToolDefinition[]) => {
|
||||
currentTools.value = [...tools]
|
||||
console.log(`[AdvancedTestPanel] Tools updated, count: ${tools.length}`)
|
||||
}
|
||||
|
||||
// 🆕 公开方法:设置工具(用于同步优化阶段的工具到测试阶段)
|
||||
const setTools = (tools: ToolDefinition[]) => {
|
||||
currentTools.value = [...tools]
|
||||
console.log('[AdvancedTestPanel] Tools synced from optimization phase:', tools)
|
||||
}
|
||||
|
||||
// 暴露方法供父组件调用
|
||||
defineExpose({
|
||||
setConversationMessages,
|
||||
setTools // 🆕 暴露工具设置方法
|
||||
})
|
||||
```
|
||||
|
||||
#### 4.2 测试阶段工具调用处理
|
||||
```typescript
|
||||
await props.services.promptService.testCustomConversationStream(
|
||||
request,
|
||||
{
|
||||
onToken: (token: string) => {
|
||||
resultRef.value += token
|
||||
},
|
||||
onReasoningToken: (reasoningToken: string) => {
|
||||
reasoningRef.value += reasoningToken
|
||||
},
|
||||
onToolCall: (toolCall: any) => { // 🆕 工具调用处理
|
||||
const toolCallsRef = isOriginalTest ? originalToolCalls : optimizedToolCalls
|
||||
toolCallsRef.value.push(toolCall)
|
||||
console.log(`[AdvancedTestPanel] ${mode} tool call received:`, toolCall)
|
||||
},
|
||||
onError: (error: Error) => {
|
||||
console.error(`[AdvancedTestPanel] ${mode} conversation test error:`, error)
|
||||
resultRef.value = `Error: ${error.message || String(error)}`
|
||||
},
|
||||
onComplete: () => {
|
||||
console.log(`[AdvancedTestPanel] ${mode} conversation test completed`)
|
||||
}
|
||||
}
|
||||
)
|
||||
```
|
||||
|
||||
## 🧪 MCP工具端到端测试验证
|
||||
|
||||
### 测试场景
|
||||
使用MCP Playwright工具在浏览器中完成完整的工具调用workflow演示:
|
||||
|
||||
1. **工具创建**: 在ContextEditor中创建get_weather工具
|
||||
2. **工具同步**: 从优化阶段同步到测试阶段
|
||||
3. **提示词优化**: 优化天气助手系统提示词
|
||||
4. **工具调用测试**: 执行Gemini工具调用测试
|
||||
5. **结果验证**: 确认工具调用信息正确传递
|
||||
|
||||
### 测试结果
|
||||
- ✅ 工具定义正确创建和保存
|
||||
- ✅ UI显示"工具: 1"和"使用的工具: get_weather"
|
||||
- ✅ Gemini API正确携带工具信息
|
||||
- ✅ 工具调用流程完整执行
|
||||
- ✅ 测试结果显示AI响应和工具意图
|
||||
|
||||
## 🔧 构建问题修复
|
||||
|
||||
### 问题描述
|
||||
TypeScript编译失败,错误信息:
|
||||
```
|
||||
error TS2345: Argument of type '{ id: string; type: string; function: { name: string; arguments: string; }; }' is not assignable to parameter of type 'ToolCall'.
|
||||
Types of property 'type' are incompatible.
|
||||
Type 'string' is not assignable to type '"function"'.
|
||||
```
|
||||
|
||||
### 解决方案
|
||||
1. **类型导入修复**:
|
||||
```typescript
|
||||
import { ILLMService, Message, StreamHandlers, LLMResponse, ModelInfo, ModelOption, ToolDefinition, ToolCall } from './types';
|
||||
```
|
||||
|
||||
2. **字面量类型断言**:
|
||||
```typescript
|
||||
// Gemini工具调用
|
||||
const toolCall: ToolCall = {
|
||||
id: `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
|
||||
type: 'function' as const, // 添加 as const 断言
|
||||
function: {
|
||||
name: functionCall.name,
|
||||
arguments: JSON.stringify(functionCall.args)
|
||||
}
|
||||
};
|
||||
|
||||
// OpenAI工具调用
|
||||
toolCalls.push({ id: '', type: 'function' as const, function: { name: '', arguments: '' } });
|
||||
```
|
||||
|
||||
### 构建验证
|
||||
- ✅ Core包构建成功 (`pnpm build:core`)
|
||||
- ✅ 完整开发环境启动 (`pnpm dev`)
|
||||
- ✅ 应用运行在 `http://localhost:18186`
|
||||
- ✅ TypeScript类型检查通过
|
||||
|
||||
## 📊 架构设计亮点
|
||||
|
||||
### 1. **统一的工具调用接口**
|
||||
```typescript
|
||||
export interface ToolCall {
|
||||
id: string;
|
||||
type: 'function';
|
||||
function: {
|
||||
name: string;
|
||||
arguments: string;
|
||||
};
|
||||
}
|
||||
|
||||
export interface StreamHandlers {
|
||||
onToken: (token: string) => void;
|
||||
onReasoningToken?: (token: string) => void;
|
||||
onToolCall?: (toolCall: ToolCall) => void; // 🆕 统一工具调用处理
|
||||
onComplete: (response?: LLMResponse) => void;
|
||||
onError: (error: Error) => void;
|
||||
}
|
||||
```
|
||||
|
||||
### 2. **多提供商兼容性**
|
||||
- **OpenAI**: 直接使用`tool_calls` delta处理
|
||||
- **Gemini**: 转换`functionCalls()`到标准`ToolCall`格式
|
||||
- **向后兼容**: 现有API无破坏性变更
|
||||
|
||||
### 3. **工具变量分离设计**
|
||||
- **原则**: 工具定义不使用变量(避免混乱)
|
||||
- **实现**: 完全移除工具变量支持功能
|
||||
- **结果**: 清晰的数据边界,变量只用于对话内容
|
||||
|
||||
### 4. **UI组件解耦**
|
||||
```
|
||||
ContextEditor (工具创建和管理)
|
||||
↓
|
||||
ConversationManager (工具统计和同步)
|
||||
↓
|
||||
AdvancedTestPanel (工具调用测试)
|
||||
```
|
||||
|
||||
## 🎯 业务价值
|
||||
|
||||
### 用户体验提升
|
||||
- **完整性**: 提示词优化和测试支持完整工具调用
|
||||
- **可视化**: 友好的工具管理界面
|
||||
- **一致性**: 优化和测试阶段数据同步
|
||||
- **实用性**: 内置常用工具模板
|
||||
|
||||
### 开发效率提升
|
||||
- **类型安全**: 完整的TypeScript类型支持
|
||||
- **标准化**: 统一的工具调用处理流程
|
||||
- **可维护性**: 清晰的组件职责分离
|
||||
- **可扩展性**: 易于添加新的LLM提供商支持
|
||||
|
||||
## 🧪 测试覆盖
|
||||
|
||||
### 功能测试
|
||||
- ✅ 工具创建和编辑
|
||||
- ✅ 工具同步机制
|
||||
- ✅ OpenAI工具调用
|
||||
- ✅ Gemini工具调用
|
||||
- ✅ UI统计显示
|
||||
|
||||
### 集成测试
|
||||
- ✅ 端到端workflow测试
|
||||
- ✅ 多提供商兼容性
|
||||
- ✅ 类型安全验证
|
||||
- ✅ 构建系统稳定性
|
||||
|
||||
### 用户验收测试
|
||||
- ✅ MCP工具演示完整流程
|
||||
- ✅ 实际天气查询场景
|
||||
- ✅ 工具调用信息正确显示
|
||||
|
||||
## 🔄 后续优化建议
|
||||
|
||||
### 短期优化 (1-2周)
|
||||
- [ ] 工具调用结果展示UI优化
|
||||
- [ ] 更多内置工具模板
|
||||
- [ ] 工具调用错误处理增强
|
||||
|
||||
### 中期扩展 (1月)
|
||||
- [ ] 实际工具执行集成
|
||||
- [ ] 工具调用链追踪
|
||||
- [ ] 工具性能统计
|
||||
|
||||
### 长期规划 (3月+)
|
||||
- [ ] 工具市场和分享
|
||||
- [ ] 自定义工具开发SDK
|
||||
- [ ] 企业级工具管理
|
||||
|
||||
## 📋 文档更新
|
||||
|
||||
本报告同步更新以下文档:
|
||||
- [x] `tool-calls-integration-design.md` - 设计方案(已实现)
|
||||
- [x] `tool-calls-context-support-implementation.md` - 实施计划(已完成)
|
||||
- [x] `TOOL_CALLS_IMPLEMENTATION_COMPLETE_2025-08-28.md` - 完成报告(本文档)
|
||||
|
||||
## 🎉 结论
|
||||
|
||||
工具调用功能已完整实现并通过端到端测试验证。系统现在支持:
|
||||
|
||||
1. **完整的工具调用pipeline**: 从定义→优化→测试→结果展示
|
||||
2. **多LLM提供商支持**: OpenAI和Gemini都能正确处理工具调用
|
||||
3. **用户友好的界面**: 直观的工具管理和统计显示
|
||||
4. **类型安全的架构**: TypeScript编译通过,运行时稳定
|
||||
|
||||
该实现为提示词优化器增加了重要的工具调用能力,使其能够支持更复杂的AI应用场景。
|
||||
|
||||
---
|
||||
|
||||
**实施完成**: 2025-08-28
|
||||
**技术负责**: Claude Code
|
||||
**测试验证**: MCP Playwright工具
|
||||
**状态**: ✅ 生产就绪
|
||||
@@ -0,0 +1,58 @@
|
||||
# 开发经验记录
|
||||
|
||||
记录开发过程中的重要经验和最佳实践。
|
||||
|
||||
## 🔧 技术经验
|
||||
|
||||
### 架构设计
|
||||
- [经验描述] - [适用场景] - [记录日期]
|
||||
|
||||
### 错误处理
|
||||
- [错误类型] - [解决方案] - [预防措施] - [记录日期]
|
||||
|
||||
### 性能优化
|
||||
- [优化点] - [优化方法] - [效果] - [记录日期]
|
||||
|
||||
### 测试实践
|
||||
- [测试类型] - [最佳实践] - [工具推荐] - [记录日期]
|
||||
|
||||
## 🛠️ 工具配置
|
||||
|
||||
### 开发工具
|
||||
- [工具名称] - [配置要点] - [使用技巧] - [记录日期]
|
||||
|
||||
### 调试技巧
|
||||
- [问题类型] - [调试方法] - [工具使用] - [记录日期]
|
||||
|
||||
## 📚 学习资源
|
||||
|
||||
### 有用文档
|
||||
- [文档标题] - [链接] - [要点总结] - [记录日期]
|
||||
|
||||
### 代码示例
|
||||
- [功能描述] - [代码片段或文件位置] - [使用场景] - [记录日期]
|
||||
|
||||
## 🚫 避坑指南
|
||||
|
||||
### 常见错误
|
||||
- [错误描述] - [原因分析] - [避免方法] - [记录日期]
|
||||
|
||||
### 设计陷阱
|
||||
- [设计问题] - [问题后果] - [正确做法] - [记录日期]
|
||||
|
||||
## 🔄 流程改进
|
||||
|
||||
### 工作流优化
|
||||
- [改进点] - [改进方法] - [效果评估] - [记录日期]
|
||||
|
||||
### 文档管理
|
||||
- [管理经验] - [工具使用] - [效率提升] - [记录日期]
|
||||
|
||||
---
|
||||
|
||||
## 📝 使用说明
|
||||
|
||||
1. **及时记录** - 遇到重要经验立即记录
|
||||
2. **分类整理** - 按照上述分类组织内容
|
||||
3. **定期回顾** - 每周回顾一次,提取可复用经验
|
||||
4. **归档整理** - 任务完成时将相关经验归档到archives
|
||||
@@ -0,0 +1,62 @@
|
||||
# 开发草稿本
|
||||
|
||||
记录当前开发任务的进展和思考。
|
||||
|
||||
## 当前任务
|
||||
|
||||
### [任务名称] - [开始日期]
|
||||
**目标**: [具体目标描述]
|
||||
**状态**: 进行中
|
||||
|
||||
#### 计划步骤
|
||||
[ ] 1. 需求分析
|
||||
[ ] 2. 技术方案设计
|
||||
[ ] 3. 功能实现
|
||||
[ ] 4. 测试验证
|
||||
[ ] 5. 文档更新
|
||||
|
||||
#### 进展记录
|
||||
- [日期] [具体进展描述]
|
||||
- [日期] [遇到的问题和解决方案]
|
||||
|
||||
#### 重要发现
|
||||
- [记录重要的技术发现或经验]
|
||||
|
||||
---
|
||||
|
||||
## 历史任务
|
||||
|
||||
### [已完成任务名称] - [完成日期] ✅
|
||||
**总结**: [简要总结]
|
||||
**经验**: [重要经验提取]
|
||||
|
||||
---
|
||||
|
||||
## 待办事项
|
||||
|
||||
### 紧急
|
||||
- [ ] [紧急任务1]
|
||||
- [ ] [紧急任务2]
|
||||
|
||||
### 重要
|
||||
- [ ] [重要任务1]
|
||||
- [ ] [重要任务2]
|
||||
|
||||
### 一般
|
||||
- [ ] [一般任务1]
|
||||
- [ ] [一般任务2]
|
||||
|
||||
---
|
||||
|
||||
## 问题记录
|
||||
|
||||
### 未解决
|
||||
- [问题描述] - [发现日期]
|
||||
|
||||
### 已解决
|
||||
- [问题描述] - [解决方案] - [解决日期]
|
||||
|
||||
---
|
||||
|
||||
## 备注
|
||||
[其他需要记录的信息]
|
||||
@@ -0,0 +1,66 @@
|
||||
# 待办事项
|
||||
|
||||
管理当前和未来的开发任务。
|
||||
|
||||
## 🔥 紧急任务
|
||||
|
||||
### 本周必须完成
|
||||
- [ ] [任务描述] - [截止日期] - [负责人]
|
||||
- [ ] [任务描述] - [截止日期] - [负责人]
|
||||
|
||||
### 今日重点
|
||||
- [ ] [任务描述] - [预计时间]
|
||||
- [ ] [任务描述] - [预计时间]
|
||||
|
||||
## ⭐ 重要任务
|
||||
|
||||
### 功能开发
|
||||
- [ ] [功能名称] - [优先级] - [预计工期]
|
||||
- [ ] [功能名称] - [优先级] - [预计工期]
|
||||
|
||||
### 技术债务
|
||||
- [ ] [技术债务描述] - [影响程度] - [预计工期]
|
||||
- [ ] [技术债务描述] - [影响程度] - [预计工期]
|
||||
|
||||
### 文档更新
|
||||
- [ ] [文档名称] - [更新内容] - [预计时间]
|
||||
- [ ] [文档名称] - [更新内容] - [预计时间]
|
||||
|
||||
## 📋 一般任务
|
||||
|
||||
### 优化改进
|
||||
- [ ] [优化项目] - [预期效果]
|
||||
- [ ] [优化项目] - [预期效果]
|
||||
|
||||
### 学习研究
|
||||
- [ ] [学习内容] - [学习目标]
|
||||
- [ ] [学习内容] - [学习目标]
|
||||
|
||||
### 工具配置
|
||||
- [ ] [工具名称] - [配置目标]
|
||||
- [ ] [工具名称] - [配置目标]
|
||||
|
||||
## ✅ 已完成
|
||||
|
||||
### 本周完成
|
||||
- [x] [任务描述] - [完成日期] - [备注]
|
||||
- [x] [任务描述] - [完成日期] - [备注]
|
||||
|
||||
## 🗓️ 未来计划
|
||||
|
||||
### 下周计划
|
||||
- [计划内容] - [预期目标]
|
||||
- [计划内容] - [预期目标]
|
||||
|
||||
### 本月目标
|
||||
- [月度目标] - [关键里程碑]
|
||||
- [月度目标] - [关键里程碑]
|
||||
|
||||
---
|
||||
|
||||
## 📝 使用说明
|
||||
|
||||
1. **优先级管理** - 按紧急程度分类任务
|
||||
2. **时间估算** - 为每个任务估算所需时间
|
||||
3. **定期更新** - 每日更新进度,每周回顾调整
|
||||
4. **完成标记** - 及时标记完成的任务并记录备注
|
||||
@@ -1,308 +0,0 @@
|
||||
# 工具调用上下文支持完整实现方案
|
||||
|
||||
## 📋 项目背景
|
||||
|
||||
基于用户需求:
|
||||
- 从LangFuse等格式导入时,能识别和处理工具调用消息
|
||||
- 将工具从消息流中分离,作为独立的工具配置管理
|
||||
- 在上下文编辑器中提供完整的工具管理功能
|
||||
- 支持不同格式间的工具转换(OpenAI vs LangFuse格式差异)
|
||||
|
||||
## 🔍 当前实现状况分析
|
||||
|
||||
### ✅ 已实现的部分
|
||||
1. **完整类型支持**:`StandardPromptData`已包含`tools`字段,支持OpenAI标准的工具定义
|
||||
2. **工具分离逻辑**:`PromptDataConverter.fromLangFuse()`已实现将`role: "tool"`消息转换为工具定义
|
||||
3. **基础导入框架**:支持多格式导入,包括LangFuse智能识别
|
||||
|
||||
### ❌ 需要增强的关键部分
|
||||
1. **UI工具管理界面**:ContextEditor缺少工具列表展示和编辑功能
|
||||
2. **数据完整性**:导出时`tools`数据丢失
|
||||
3. **变量集成**:工具定义中的变量未被扫描和管理
|
||||
4. **格式转换**:缺少导出到不同格式时的工具处理
|
||||
5. **工具编辑器**:需要可视化的工具参数编辑界面
|
||||
|
||||
## 📋 实施计划概览
|
||||
|
||||
### 1. **数据层增强** (核心基础)
|
||||
- 修复ContextEditor导出逻辑,确保tools数据完整性
|
||||
- 增强变量扫描系统,支持工具定义中的变量提取
|
||||
- 完善导出时的格式转换(OpenAI vs LangFuse格式差异)
|
||||
|
||||
### 2. **UI组件开发** (用户界面)
|
||||
- 在ContextEditor中添加工具管理面板
|
||||
- 实现工具列表展示组件(可折叠)
|
||||
- 开发工具编辑器组件(JSON Schema支持)
|
||||
- 添加工具添加/删除/复制功能
|
||||
|
||||
### 3. **变量系统集成** (数据一致性)
|
||||
- 扩展变量扫描函数,支持工具参数中的变量
|
||||
- 在工具预览中支持变量替换和高亮
|
||||
- 集成工具变量到缺失变量检测系统
|
||||
|
||||
### 4. **增强导入/导出** (格式兼容)
|
||||
- 完善LangFuse格式的工具处理
|
||||
- 实现导出时根据目标格式处理工具
|
||||
- 支持工具定义的模板化和变量化
|
||||
|
||||
## 🎯 实施优先级与详细步骤
|
||||
|
||||
### P0: 数据完整性修复 (导出tools数据)
|
||||
|
||||
#### 修复目标
|
||||
- ContextEditor导出时保留tools数据
|
||||
- 确保导入的工具不会在导出时丢失
|
||||
|
||||
#### 实施步骤
|
||||
1. **修改ContextEditor.vue exportData计算属性**
|
||||
```typescript
|
||||
const exportData = computed(() => {
|
||||
const data: StandardPromptData = {
|
||||
messages: messages.value,
|
||||
tools: tools.value, // 添加工具数据
|
||||
metadata: {
|
||||
source: 'context_editor',
|
||||
variables: {},
|
||||
tools_count: tools.value?.length || 0,
|
||||
exported_at: new Date().toISOString()
|
||||
}
|
||||
}
|
||||
return JSON.stringify(data, null, 2)
|
||||
})
|
||||
```
|
||||
|
||||
2. **添加tools响应式状态**
|
||||
```typescript
|
||||
const tools = ref<ToolDefinition[]>([])
|
||||
```
|
||||
|
||||
3. **修改导入处理逻辑**
|
||||
- 在handleImport中保存导入的工具数据
|
||||
- 在contextEditor的返回结果中提取tools
|
||||
|
||||
### P1: 基础工具管理UI (展示+编辑)
|
||||
|
||||
#### UI设计目标
|
||||
- 在消息列表下方添加工具管理区域
|
||||
- 支持工具列表展示(可折叠)
|
||||
- 提供基础的添加/删除/编辑功能
|
||||
|
||||
#### 实施步骤
|
||||
1. **在ContextEditor模板中添加工具面板**
|
||||
```vue
|
||||
<!-- 工具管理面板 -->
|
||||
<div v-if="tools.length > 0 || showToolsPanel" class="tools-panel">
|
||||
<div class="tools-header">
|
||||
<h4>工具定义 ({{ tools.length }})</h4>
|
||||
<button @click="toggleToolsPanel">{{ showToolsPanel ? '收起' : '展开' }}</button>
|
||||
</div>
|
||||
|
||||
<div v-if="showToolsPanel" class="tools-content">
|
||||
<!-- 工具列表 -->
|
||||
<div v-for="(tool, index) in tools" :key="`tool-${index}`" class="tool-item">
|
||||
<div class="tool-header">
|
||||
<span class="tool-name">{{ tool.function.name }}</span>
|
||||
<div class="tool-actions">
|
||||
<button @click="editTool(index)">编辑</button>
|
||||
<button @click="deleteTool(index)">删除</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tool-description">{{ tool.function.description }}</div>
|
||||
</div>
|
||||
|
||||
<!-- 添加工具按钮 -->
|
||||
<button @click="addNewTool" class="add-tool-btn">+ 添加工具</button>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
2. **实现工具管理方法**
|
||||
```typescript
|
||||
const showToolsPanel = ref(false)
|
||||
|
||||
const toggleToolsPanel = () => {
|
||||
showToolsPanel.value = !showToolsPanel.value
|
||||
}
|
||||
|
||||
const addNewTool = () => {
|
||||
tools.value.push({
|
||||
type: 'function',
|
||||
function: {
|
||||
name: 'new_tool',
|
||||
description: '新建工具',
|
||||
parameters: {
|
||||
type: 'object',
|
||||
properties: {},
|
||||
required: []
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const deleteTool = (index: number) => {
|
||||
tools.value.splice(index, 1)
|
||||
}
|
||||
|
||||
const editTool = (index: number) => {
|
||||
// TODO: 打开工具编辑器
|
||||
}
|
||||
```
|
||||
|
||||
### P2: 变量系统集成 (扫描+替换)
|
||||
|
||||
#### 集成目标
|
||||
- 工具参数中的变量能被扫描识别
|
||||
- 支持工具参数的变量预览和替换
|
||||
- 集成到现有的缺失变量检测系统
|
||||
|
||||
#### 实施步骤
|
||||
1. **扩展变量扫描函数**
|
||||
```typescript
|
||||
// 扫描工具中的变量
|
||||
const scanToolVariables = (tools: ToolDefinition[]): string[] => {
|
||||
const variables = new Set<string>()
|
||||
|
||||
tools.forEach(tool => {
|
||||
const toolStr = JSON.stringify(tool)
|
||||
const matches = toolStr.match(/\{\{\s*([^}]+)\s*\}\}/g)
|
||||
if (matches) {
|
||||
matches.forEach(match => {
|
||||
const varName = match.replace(/\{\{\s*|\s*\}\}/g, '')
|
||||
variables.add(varName)
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
return Array.from(variables)
|
||||
}
|
||||
|
||||
// 更新allUsedVariables计算属性
|
||||
const allUsedVariables = computed(() => {
|
||||
const variables = new Set<string>()
|
||||
|
||||
// 扫描消息中的变量
|
||||
messages.value.forEach(message => {
|
||||
const messageVars = scanVariables(message.content)
|
||||
messageVars.forEach(v => variables.add(v))
|
||||
})
|
||||
|
||||
// 扫描工具中的变量
|
||||
const toolVars = scanToolVariables(tools.value)
|
||||
toolVars.forEach(v => variables.add(v))
|
||||
|
||||
return Array.from(variables)
|
||||
})
|
||||
```
|
||||
|
||||
2. **工具变量替换和预览**
|
||||
```typescript
|
||||
const replaceToolVariables = (tools: ToolDefinition[], variables: Record<string, string>): ToolDefinition[] => {
|
||||
return tools.map(tool => {
|
||||
const toolStr = JSON.stringify(tool)
|
||||
const replacedStr = replaceVariables(toolStr, variables)
|
||||
return JSON.parse(replacedStr)
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
### P3: 高级功能 (预览+验证+模板化)
|
||||
|
||||
#### 功能目标
|
||||
- 工具定义的JSON Schema验证
|
||||
- 工具参数的可视化编辑器
|
||||
- 工具模板化支持
|
||||
|
||||
#### 实施步骤
|
||||
1. **工具编辑器组件开发**
|
||||
2. **JSON Schema验证集成**
|
||||
3. **工具模板化功能**
|
||||
|
||||
## 🏗️ 技术架构设计
|
||||
|
||||
### 数据流设计
|
||||
```
|
||||
导入数据 -> PromptDataConverter -> StandardPromptData -> ContextEditor
|
||||
├─ messages[]
|
||||
├─ tools[]
|
||||
└─ metadata
|
||||
```
|
||||
|
||||
### 变量扫描范围扩展
|
||||
```
|
||||
扫描范围:
|
||||
├─ messages[].content (现有)
|
||||
├─ tools[].function.description (新增)
|
||||
├─ tools[].function.parameters (新增)
|
||||
└─ metadata.* (可选)
|
||||
```
|
||||
|
||||
### UI组件层次
|
||||
```
|
||||
ContextEditor
|
||||
├─ MessageList (现有)
|
||||
├─ ToolsPanel (新增)
|
||||
│ ├─ ToolList
|
||||
│ └─ ToolEditor
|
||||
└─ ImportExportDialogs (增强)
|
||||
```
|
||||
|
||||
## 📊 预期效果
|
||||
|
||||
### 用户体验提升
|
||||
- **完整性**:导入的工具调用信息不会丢失
|
||||
- **可视化**:工具定义以友好界面展示和编辑
|
||||
- **一致性**:工具变量与消息变量统一管理
|
||||
- **兼容性**:支持多种格式的无缝转换
|
||||
|
||||
### 开发收益
|
||||
- **标准化**:统一的工具数据处理流程
|
||||
- **扩展性**:易于添加新的工具类型支持
|
||||
- **维护性**:清晰的数据分离和组件职责
|
||||
|
||||
## 🧪 测试策略
|
||||
|
||||
### 单元测试
|
||||
- 工具导入转换逻辑测试
|
||||
- 变量扫描和替换测试
|
||||
- 数据完整性验证测试
|
||||
|
||||
### 集成测试
|
||||
- LangFuse格式完整导入导出测试
|
||||
- 工具+变量联合管理测试
|
||||
- 多格式转换兼容性测试
|
||||
|
||||
### 用户测试
|
||||
- 使用真实LangFuse数据测试导入
|
||||
- 工具编辑和管理流程测试
|
||||
- 变量管理集成体验测试
|
||||
|
||||
## 📅 开发时间估算
|
||||
|
||||
- **P0 数据完整性修复**: 0.5天
|
||||
- **P1 基础工具UI**: 1-1.5天
|
||||
- **P2 变量系统集成**: 1天
|
||||
- **P3 高级功能**: 1.5-2天
|
||||
|
||||
**总计**: 4-5天完整实现
|
||||
|
||||
## 🔄 迭代计划
|
||||
|
||||
### 第一版 (MVP)
|
||||
- 数据完整性修复
|
||||
- 基础工具列表展示
|
||||
- 基本的添加/删除功能
|
||||
|
||||
### 第二版 (增强)
|
||||
- 变量系统完整集成
|
||||
- 工具参数编辑器
|
||||
- 预览和验证功能
|
||||
|
||||
### 第三版 (完善)
|
||||
- JSON Schema支持
|
||||
- 工具模板化
|
||||
- 高级导入导出选项
|
||||
|
||||
---
|
||||
|
||||
*文档创建时间: 2025-08-28*
|
||||
*实施状态: 准备开始*
|
||||
@@ -1,268 +0,0 @@
|
||||
# 工具调用测试集成完整设计方案
|
||||
|
||||
## 📋 问题分析
|
||||
|
||||
你的观察非常准确!当前系统存在以下关键问题:
|
||||
|
||||
### 1. **类型定义缺失工具支持**
|
||||
- `CustomConversationRequest` 类型不包含 `tools` 字段
|
||||
- 测试请求时无法传递工具定义到LLM服务
|
||||
|
||||
### 2. **测试流程工具数据丢失**
|
||||
- `AdvancedTestPanel` 在创建测试请求时不包含工具数据
|
||||
- 即使ContextEditor中定义了工具,测试时也不会被使用
|
||||
|
||||
### 3. **工具调用响应处理缺失**
|
||||
- 当前系统不处理LLM返回的工具调用请求
|
||||
- 没有工具调用结果的回传机制
|
||||
|
||||
## 🎯 完整解决方案
|
||||
|
||||
### 阶段1: 类型系统扩展
|
||||
|
||||
#### 1.1 扩展 `CustomConversationRequest` 类型
|
||||
```typescript
|
||||
// packages/core/src/services/prompt/types.ts
|
||||
export interface CustomConversationRequest {
|
||||
modelKey: string;
|
||||
messages: ConversationMessage[];
|
||||
variables: Record<string, string>;
|
||||
tools?: ToolDefinition[]; // 🆕 添加工具支持
|
||||
}
|
||||
```
|
||||
|
||||
#### 1.2 扩展 LLM 服务接口
|
||||
```typescript
|
||||
// packages/core/src/services/llm/types.ts
|
||||
export interface LLMRequest {
|
||||
messages: StandardMessage[];
|
||||
model?: string;
|
||||
temperature?: number;
|
||||
max_tokens?: number;
|
||||
tools?: ToolDefinition[]; // 🆕 添加工具支持
|
||||
stream?: boolean;
|
||||
}
|
||||
|
||||
export interface LLMResponse {
|
||||
content: string;
|
||||
finishReason?: 'stop' | 'length' | 'tool_calls';
|
||||
toolCalls?: ToolCall[]; // 🆕 工具调用信息
|
||||
usage?: {
|
||||
promptTokens: number;
|
||||
completionTokens: number;
|
||||
totalTokens: number;
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### 阶段2: 服务层集成
|
||||
|
||||
#### 2.1 更新 PromptService
|
||||
```typescript
|
||||
// packages/core/src/services/prompt/service.ts
|
||||
async testCustomConversationStream(
|
||||
request: CustomConversationRequest,
|
||||
callbacks: StreamCallbacks
|
||||
): Promise<void> {
|
||||
// ... 现有逻辑 ...
|
||||
|
||||
const llmRequest: LLMRequest = {
|
||||
messages: processedMessages,
|
||||
model: modelConfig.model,
|
||||
temperature: modelConfig.temperature,
|
||||
max_tokens: modelConfig.maxTokens,
|
||||
tools: request.tools, // 🆕 传递工具定义
|
||||
stream: true
|
||||
}
|
||||
|
||||
// 处理工具调用响应
|
||||
const response = await llmService.generateStream(llmRequest, {
|
||||
onToken: callbacks.onToken,
|
||||
onToolCall: callbacks.onToolCall, // 🆕 工具调用回调
|
||||
onComplete: callbacks.onComplete,
|
||||
onError: callbacks.onError
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2 更新 LLM Service 实现
|
||||
```typescript
|
||||
// packages/core/src/services/llm/openai-service.ts
|
||||
async generateStream(request: LLMRequest, callbacks: StreamCallbacks): Promise<void> {
|
||||
const openaiRequest = {
|
||||
messages: request.messages,
|
||||
model: request.model,
|
||||
temperature: request.temperature,
|
||||
max_tokens: request.max_tokens,
|
||||
tools: request.tools, // 🆕 传递工具到 OpenAI
|
||||
stream: true
|
||||
}
|
||||
|
||||
const stream = await this.client.chat.completions.create(openaiRequest)
|
||||
|
||||
for await (const chunk of stream) {
|
||||
const delta = chunk.choices[0]?.delta
|
||||
|
||||
if (delta.content) {
|
||||
callbacks.onToken?.(delta.content)
|
||||
}
|
||||
|
||||
if (delta.tool_calls) { // 🆕 处理工具调用
|
||||
callbacks.onToolCall?.(delta.tool_calls)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 阶段3: UI层集成
|
||||
|
||||
#### 3.1 更新 AdvancedTestPanel
|
||||
```typescript
|
||||
// packages/ui/src/components/AdvancedTestPanel.vue
|
||||
interface Props {
|
||||
// ... 现有属性 ...
|
||||
tools?: ToolDefinition[]; // 🆕 接收工具定义
|
||||
}
|
||||
|
||||
const testCustomConversationWithMode = async (mode: 'original' | 'optimized') => {
|
||||
// ... 现有逻辑 ...
|
||||
|
||||
const request: CustomConversationRequest = {
|
||||
modelKey: selectedTestModel.value,
|
||||
messages: conversationMessages.value,
|
||||
variables: contextVariables,
|
||||
tools: props.tools // 🆕 传递工具定义
|
||||
}
|
||||
|
||||
await props.services.promptService.testCustomConversationStream(
|
||||
request,
|
||||
{
|
||||
onToken: (token: string) => {
|
||||
resultRef.value += token
|
||||
},
|
||||
onToolCall: (toolCalls: ToolCall[]) => { // 🆕 处理工具调用
|
||||
handleToolCalls(toolCalls, resultRef)
|
||||
},
|
||||
onComplete: () => {
|
||||
isTestingRef.value = false
|
||||
},
|
||||
onError: (error) => {
|
||||
errorRef.value = error.message
|
||||
isTestingRef.value = false
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2 父组件传递工具数据
|
||||
```vue
|
||||
<!-- 主应用组件 -->
|
||||
<AdvancedTestPanel
|
||||
:tools="currentTools"
|
||||
:originalPrompt="originalPrompt"
|
||||
:optimizedPrompt="optimizedPrompt"
|
||||
@showConfig="showConfig"
|
||||
/>
|
||||
```
|
||||
|
||||
### 阶段4: 工具调用处理机制
|
||||
|
||||
#### 4.1 工具调用执行框架
|
||||
```typescript
|
||||
// packages/ui/src/composables/useToolExecution.ts
|
||||
export interface ToolExecutionResult {
|
||||
toolCallId: string;
|
||||
result: string;
|
||||
error?: string;
|
||||
}
|
||||
|
||||
export function useToolExecution() {
|
||||
const executeToolCall = async (toolCall: ToolCall): Promise<ToolExecutionResult> => {
|
||||
try {
|
||||
// 这里可以实现实际的工具执行逻辑
|
||||
// 或者显示模拟结果
|
||||
const result = await simulateToolExecution(toolCall)
|
||||
|
||||
return {
|
||||
toolCallId: toolCall.id,
|
||||
result: JSON.stringify(result)
|
||||
}
|
||||
} catch (error) {
|
||||
return {
|
||||
toolCallId: toolCall.id,
|
||||
result: '',
|
||||
error: error.message
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return { executeToolCall }
|
||||
}
|
||||
```
|
||||
|
||||
#### 4.2 工具调用UI显示
|
||||
```vue
|
||||
<!-- 在测试结果中显示工具调用 -->
|
||||
<div v-if="toolCalls.length > 0" class="tool-calls-section mt-4">
|
||||
<h4 class="text-sm font-medium mb-2">🛠️ 工具调用</h4>
|
||||
<div v-for="toolCall in toolCalls" :key="toolCall.id"
|
||||
class="tool-call-item p-3 bg-blue-50 border-l-4 border-blue-400 mb-2">
|
||||
<div class="text-sm font-medium text-blue-700">
|
||||
{{ toolCall.function.name }}
|
||||
</div>
|
||||
<div class="text-xs text-blue-600 mt-1">
|
||||
参数: {{ toolCall.function.arguments }}
|
||||
</div>
|
||||
<div class="text-xs text-green-600 mt-1">
|
||||
结果: {{ getToolCallResult(toolCall.id) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## 📊 实施优先级
|
||||
|
||||
### P1: 核心类型和服务扩展 (高优先级)
|
||||
- [ ] 扩展 `CustomConversationRequest` 包含 tools
|
||||
- [ ] 更新 LLM 服务接口支持工具传递
|
||||
- [ ] 修改 PromptService 传递工具数据
|
||||
|
||||
### P2: UI集成和数据传递 (中优先级)
|
||||
- [ ] AdvancedTestPanel 接收和使用工具数据
|
||||
- [ ] ContextEditor 与测试面板的工具数据传递
|
||||
- [ ] 父组件协调工具数据流
|
||||
|
||||
### P3: 工具调用响应处理 (高价值)
|
||||
- [ ] 工具调用结果显示UI
|
||||
- [ ] 工具执行模拟框架
|
||||
- [ ] 工具调用的流式响应处理
|
||||
|
||||
### P4: 高级功能 (后期优化)
|
||||
- [ ] 实际工具执行集成
|
||||
- [ ] 工具调用链追踪
|
||||
- [ ] 工具性能统计
|
||||
|
||||
## 🎯 预期效果
|
||||
|
||||
### 用户体验
|
||||
- ✅ 在ContextEditor中定义的工具能在测试中生效
|
||||
- ✅ 测试结果显示AI的工具调用意图
|
||||
- ✅ 完整的工具调用上下文保持
|
||||
|
||||
### 开发收益
|
||||
- ✅ 统一的工具调用处理架构
|
||||
- ✅ 类型安全的工具数据传递
|
||||
- ✅ 易于扩展的工具执行框架
|
||||
|
||||
## 🔄 实施步骤
|
||||
|
||||
1. **立即开始**: P1 核心类型扩展
|
||||
2. **第二阶段**: P2 UI集成
|
||||
3. **第三阶段**: P3 工具调用响应处理
|
||||
4. **后续迭代**: P4 高级功能
|
||||
|
||||
---
|
||||
|
||||
*文档创建时间: 2025-08-28*
|
||||
*状态: 设计完成,准备实施*
|
||||
Reference in new issue
Block a user