feat: add AI学习助手 agent (KG+RAG ideal) and renshenguo feishu bot

- Add AI学习助手 agent creation script with all 39 tools, 3-layer KG+RAG memory
- Add renshenguo (人参果) feishu bot integration (app_service + ws_handler)
- Register renshenguo WS client in main.py startup
- Add RENSHENGUO_APP_ID / RENSHENGUO_APP_SECRET / RENSHENGUO_AGENT_ID config
- Reorganize docs from root into docs/ subdirectories
- Move startup scripts to scripts/startup/
- Various backend optimizations and tool improvements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
renjianbo
2026-05-06 01:37:13 +08:00
parent f33bc461ff
commit eabf90c496
171 changed files with 4906 additions and 445 deletions

View File

@@ -0,0 +1,286 @@
# WebSocket实时推送说明
## ✅ 已完成
已实现WebSocket实时推送功能可以实时推送工作流执行状态。
## 功能特性
### 1. WebSocket连接管理器 (`backend/app/websocket/manager.py`)
- 管理多个WebSocket连接
- 支持按执行ID分组连接
- 支持广播消息到特定执行的所有连接
- 自动处理连接断开
### 2. WebSocket API (`backend/app/api/websocket.py`)
- WebSocket端点`/api/v1/ws/executions/{execution_id}`
- 实时推送执行状态更新
- 支持心跳检测ping/pong
- 自动断开已完成或失败的执行
## WebSocket消息格式
### 客户端 → 服务器
#### 心跳消息
```json
{
"type": "ping"
}
```
### 服务器 → 客户端
#### 状态更新消息
```json
{
"type": "status",
"execution_id": "execution-uuid",
"status": "running",
"progress": 50,
"message": "执行中...",
"result": null,
"error": null,
"execution_time": null
}
```
#### 心跳响应
```json
{
"type": "pong"
}
```
#### 错误消息
```json
{
"type": "error",
"message": "错误描述"
}
```
## 状态值说明
- `pending`: 等待执行
- `running`: 执行中
- `completed`: 执行完成
- `failed`: 执行失败
## 使用方法
### 1. 建立WebSocket连接
```javascript
const executionId = 'your-execution-id';
const ws = new WebSocket(`ws://localhost:8037/api/v1/ws/executions/${executionId}`);
ws.onopen = () => {
console.log('WebSocket连接已建立');
};
ws.onmessage = (event) => {
const message = JSON.parse(event.data);
console.log('收到消息:', message);
switch (message.type) {
case 'status':
// 更新执行状态
updateExecutionStatus(message);
break;
case 'error':
// 显示错误
showError(message.message);
break;
case 'pong':
// 心跳响应
break;
}
};
ws.onerror = (error) => {
console.error('WebSocket错误:', error);
};
ws.onclose = () => {
console.log('WebSocket连接已关闭');
};
```
### 2. 发送心跳消息
```javascript
// 定期发送心跳每30秒
setInterval(() => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({ type: 'ping' }));
}
}, 30000);
```
### 3. 处理状态更新
```javascript
function updateExecutionStatus(message) {
const { status, progress, result, error, execution_time } = message;
// 更新UI
document.getElementById('status').textContent = status;
document.getElementById('progress').style.width = `${progress}%`;
if (status === 'completed') {
// 显示结果
displayResult(result);
} else if (status === 'failed') {
// 显示错误
displayError(error);
}
}
```
## 前端集成示例Vue 3
```vue
<template>
<div>
<div>状态: {{ executionStatus }}</div>
<div>进度: {{ progress }}%</div>
<div v-if="result">结果: {{ result }}</div>
<div v-if="error" class="error">错误: {{ error }}</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue'
const props = defineProps<{
executionId: string
}>()
const executionStatus = ref('pending')
const progress = ref(0)
const result = ref(null)
const error = ref(null)
let ws: WebSocket | null = null
onMounted(() => {
// 获取WebSocket URL
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'
const hostname = window.location.hostname
const wsUrl = `${protocol}//${hostname}:8037/api/v1/ws/executions/${props.executionId}`
ws = new WebSocket(wsUrl)
ws.onopen = () => {
console.log('WebSocket连接已建立')
}
ws.onmessage = (event) => {
const message = JSON.parse(event.data)
if (message.type === 'status') {
executionStatus.value = message.status
progress.value = message.progress || 0
result.value = message.result
error.value = message.error
}
}
ws.onerror = (err) => {
console.error('WebSocket错误:', err)
}
ws.onclose = () => {
console.log('WebSocket连接已关闭')
}
// 心跳
const heartbeat = setInterval(() => {
if (ws?.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({ type: 'ping' }))
}
}, 30000)
onUnmounted(() => {
clearInterval(heartbeat)
ws?.close()
})
})
</script>
```
## 完整示例
### 1. 执行工作流并监听状态
```javascript
// 1. 创建执行任务
const response = await fetch('/api/v1/executions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
workflow_id: 'workflow-id',
input_data: { input: 'test' }
})
})
const execution = await response.json()
const executionId = execution.id
// 2. 建立WebSocket连接
const ws = new WebSocket(`ws://localhost:8037/api/v1/ws/executions/${executionId}`)
ws.onmessage = (event) => {
const message = JSON.parse(event.data)
if (message.type === 'status') {
console.log('执行状态:', message.status)
console.log('进度:', message.progress)
if (message.status === 'completed') {
console.log('执行结果:', message.result)
} else if (message.status === 'failed') {
console.error('执行失败:', message.error)
}
}
}
```
## 注意事项
1. **连接管理**
- WebSocket连接会在执行完成或失败后自动断开
- 客户端应该处理连接断开的情况
- 建议实现重连机制
2. **心跳检测**
- 客户端应该定期发送ping消息
- 服务器会响应pong消息
- 如果长时间没有收到消息,连接可能会被关闭
3. **错误处理**
- 处理网络错误
- 处理执行失败的情况
- 显示友好的错误信息
4. **性能考虑**
- 状态更新频率每2秒更新一次
- 多个客户端可以同时监听同一个执行
- 连接会在执行完成后自动清理
## 后续计划
- [ ] 前端WebSocket组件封装
- [ ] 执行进度百分比计算
- [ ] 节点级别的状态推送
- [ ] 执行日志实时推送
- [ ] WebSocket认证支持
---
**状态**: ✅ 后端已完成,前端集成待完成
**时间**: 2024年

View File

@@ -0,0 +1,287 @@
# 内置工具列表
平台目前提供 **8个内置工具**可以在LLM节点中启用工具调用来使用。
## 📋 工具列表
### 1. 🌐 http_request - HTTP请求工具
**功能**: 发送HTTP请求支持GET、POST、PUT、DELETE方法
**用途**:
- 调用外部API
- 获取网页内容
- 发送数据到服务器
**参数**:
- `url` (必需): 请求的URL地址
- `method` (可选): HTTP方法默认GET
- `headers` (可选): HTTP请求头
- `body` (可选): 请求体POST/PUT时使用
**示例**:
```json
{
"url": "https://api.github.com/users/octocat",
"method": "GET"
}
```
---
### 2. 📖 file_read - 文件读取工具
**功能**: 读取文件内容
**用途**:
- 读取配置文件
- 读取文档内容
- 读取数据文件
**参数**:
- `file_path` (必需): 文件路径(只能读取项目目录下的文件)
**示例**:
```json
{
"file_path": "backend/app/core/config.py"
}
```
---
### 3. ✍️ file_write - 文件写入工具
**功能**: 写入文件内容
**用途**:
- 保存处理结果
- 创建配置文件
- 写入日志文件
**参数**:
- `file_path` (必需): 文件路径(只能写入项目目录下的文件)
- `content` (必需): 要写入的内容
- `mode` (可选): 写入模式w=覆盖a=追加默认w
**示例**:
```json
{
"file_path": "output/result.txt",
"content": "处理结果",
"mode": "w"
}
```
---
### 4. 📊 text_analyze - 文本分析工具
**功能**: 分析文本内容
**用途**:
- 统计文本字数、行数等
- 提取关键词
- 生成文本摘要
**参数**:
- `text` (必需): 要分析的文本内容
- `operation` (可选): 操作类型
- `count`: 统计字数、字符数、行数、段落数
- `keywords`: 提取关键词(基于词频)
- `summary`: 生成摘要取前3句
**示例**:
```json
{
"text": "这是一段很长的文本...",
"operation": "count"
}
```
---
### 5. 🕐 datetime - 日期时间工具
**功能**: 获取和处理日期时间信息
**用途**:
- 获取当前时间
- 格式化时间
- 时间戳转换
**参数**:
- `operation` (可选): 操作类型
- `now`: 获取当前时间(默认)
- `format`: 格式化时间
- `format` (可选): 时间格式字符串,默认 "%Y-%m-%d %H:%M:%S"
**示例**:
```json
{
"operation": "now",
"format": "%Y-%m-%d %H:%M:%S"
}
```
---
### 6. 🔢 math_calculate - 数学计算工具
**功能**: 执行数学计算
**用途**:
- 基本数学运算(加减乘除)
- 数学函数计算sqrt, sin, cos, log等
- 复杂数学表达式计算
**参数**:
- `expression` (必需): 数学表达式
**支持的函数**:
- `sqrt(x)`: 平方根
- `sin(x)`, `cos(x)`, `tan(x)`: 三角函数
- `log(x)`: 自然对数
- `exp(x)`: 指数函数
- `abs(x)`: 绝对值
- `pow(x, y)`: 幂运算
- `pi`: 圆周率
- `e`: 自然常数
**示例**:
```json
{
"expression": "sqrt(16) + sin(0) * cos(0)"
}
```
---
### 7. 💻 system_info - 系统信息工具
**功能**: 获取系统信息
**用途**:
- 查看操作系统信息
- 查看Python版本
- 查看系统架构
**参数**: 无
**返回信息**:
- 操作系统平台
- 系统版本
- 处理器架构
- Python版本
**示例**:
```json
{}
```
---
### 8. 📦 json_process - JSON处理工具
**功能**: 处理JSON数据
**用途**:
- 解析JSON字符串
- 序列化数据为JSON
- 验证JSON格式
**参数**:
- `json_string` (必需): JSON字符串
- `operation` (可选): 操作类型
- `parse`: 解析JSON默认
- `stringify`: 序列化为JSON
- `validate`: 验证JSON格式
**示例**:
```json
{
"json_string": "{\"name\": \"test\"}",
"operation": "parse"
}
```
---
## 🎯 使用场景示例
### 场景1: 数据获取和处理
```
用户: "查询GitHub用户信息并保存到文件"
→ LLM调用 http_request 获取数据
→ LLM调用 json_process 解析数据
→ LLM调用 file_write 保存结果
```
### 场景2: 文本分析
```
用户: "分析这段文本的字数和关键词"
→ LLM调用 text_analyze (count) 统计字数
→ LLM调用 text_analyze (keywords) 提取关键词
```
### 场景3: 数学计算
```
用户: "计算 2的10次方 加上 16的平方根"
→ LLM调用 math_calculate("pow(2, 10) + sqrt(16)")
```
### 场景4: 文件处理
```
用户: "读取config.json文件并解析"
→ LLM调用 file_read 读取文件
→ LLM调用 json_process 解析内容
```
---
## ⚠️ 安全限制
1. **文件操作限制**:
- 只能读写项目目录下的文件
- 不允许访问系统敏感文件
2. **数学计算限制**:
- 只允许安全的数学函数
- 不允许执行任意代码
3. **HTTP请求限制**:
- 超时时间30秒
- 建议在生产环境中添加域名白名单
---
## 📝 如何启用工具
1. 在工作流编辑器中选择LLM节点
2. 打开"工具"标签页
3. 启用"启用工具调用"开关
4. 选择需要的工具(可多选)
5. 保存配置
---
## 🔄 工具调用流程
```
用户输入
LLM节点启用工具
LLM分析需求决定调用哪个工具
执行工具
工具返回结果
LLM基于结果生成最终回复
```
---
**最后更新**: 2026-01-23
**工具总数**: 8个

View File

@@ -0,0 +1,157 @@
# 前端功能完成说明
## ✅ 已完成
已实现前端工作流模板、导入导出和执行历史优化功能。
## 功能特性
### 1. 工作流模板功能
#### 模板选择界面
- 在工作流列表页添加"从模板创建"按钮
- 点击后弹出模板选择对话框
- 显示所有可用模板(卡片式布局)
- 每个模板显示名称和描述
- 点击模板卡片或"使用此模板"按钮创建工作流
#### 快速创建工作流
- 从模板创建时,可以自定义工作流名称
- 自动跳转到工作流编辑器
- 模板数据已预填充,可直接编辑
### 2. 工作流导入导出功能
#### 导出功能
- 在工作流列表的操作列添加"导出"按钮
- 点击后自动下载JSON格式的工作流文件
- 文件名格式:`{工作流名称}_{时间戳}.json`
#### 导入功能
- 在工作流列表页添加"导入工作流"按钮
- 点击后弹出导入对话框
- 支持拖拽上传或点击上传
- 自动验证JSON格式
- 导入成功后自动跳转到工作流编辑器
### 3. 执行历史优化
#### 分页功能
- 使用Element Plus的Pagination组件
- 支持每页10/20/50/100条记录
- 显示总记录数和当前页码
- 支持跳转到指定页码
#### 筛选功能
- 状态筛选下拉框
- 支持筛选:全部、等待中、执行中、已完成、失败
- 筛选后自动刷新列表
#### 搜索功能
- 搜索框支持实时搜索
- 搜索范围执行ID、工作流ID、任务ID
- 支持回车键搜索
- 支持清空搜索
#### UI优化
- 筛选和搜索栏使用卡片式布局
- 清晰的视觉层次
- 响应式设计
## 使用说明
### 1. 从模板创建工作流
1. 在工作流列表页点击"从模板创建"按钮
2. 在对话框中选择模板
3. 输入工作流名称
4. 点击"创建"按钮
5. 自动跳转到工作流编辑器
### 2. 导出工作流
1. 在工作流列表中找到要导出的工作流
2. 点击操作列的"导出"按钮
3. 自动下载JSON文件
### 3. 导入工作流
1. 在工作流列表页点击"导入工作流"按钮
2. 选择或拖拽JSON文件
3. 点击"导入"按钮
4. 自动跳转到工作流编辑器
### 4. 执行历史查询
1. 进入执行历史页面
2. 使用搜索框搜索执行记录
3. 使用状态筛选下拉框筛选状态
4. 使用分页组件浏览不同页的记录
## 技术实现
### 1. Store更新
#### workflow.ts
- `fetchTemplates()`: 获取模板列表
- `fetchTemplate()`: 获取模板详情
- `createWorkflowFromTemplate()`: 从模板创建工作流
- `exportWorkflow()`: 导出工作流
- `importWorkflow()`: 导入工作流
#### execution.ts
- `fetchExecutions()`: 支持分页、筛选、搜索参数
### 2. 组件更新
#### Home.vue
- 添加模板选择对话框
- 添加导入对话框
- 添加导出按钮
- 优化按钮布局
#### Executions.vue
- 添加筛选和搜索栏
- 添加分页组件
- 优化表格布局
## 界面截图说明
### 工作流列表页
- 顶部操作栏:从模板创建、导入工作流、创建工作流
- 表格操作列:编辑、导出、执行历史、删除
### 模板选择对话框
- 卡片式布局,每个模板一个卡片
- 显示模板名称和描述
- 悬停效果
### 导入对话框
- 拖拽上传区域
- 文件选择按钮
- 导入确认按钮
### 执行历史页
- 筛选栏:搜索框、状态筛选、搜索/重置按钮
- 数据表格:执行记录列表
- 分页组件:底部分页控件
## 优势
1. **快速创建**:使用模板快速创建工作流,提高效率
2. **工作流复用**:通过导入导出复用工作流,便于分享
3. **高效查询**:执行历史支持分页、筛选、搜索,快速找到目标记录
4. **用户友好**清晰的UI和流畅的交互体验
## 后续计划
- [ ] 模板预览功能
- [ ] 工作流搜索和筛选
- [ ] 批量操作功能
- [ ] 工作流收藏功能
- [ ] 模板市场(用户分享模板)
---
**状态**: ✅ 已完成
**时间**: 2024年

View File

@@ -0,0 +1,160 @@
# 功能完成总结
## ✅ 本次开发完成的功能
### 1. 执行结果展示页面 ✅
#### 1.1 执行历史列表页面 (`Executions.vue`)
- ✅ 显示所有执行记录
- ✅ 支持按工作流ID筛选
- ✅ 显示执行状态、执行时间、创建时间
- ✅ 点击行或按钮查看详情
- ✅ 支持刷新列表
#### 1.2 执行详情页面 (`ExecutionDetail.vue`)
- ✅ 显示完整的执行信息
- ✅ 显示输入数据和输出数据JSON格式
- ✅ 显示执行状态、执行时间、错误信息
- ✅ 支持跳转到关联的工作流
- ✅ 自动刷新执行状态(轮询)
### 2. WebSocket前端集成 ✅
#### 2.1 WebSocket Composable (`useWebSocket.ts`)
- ✅ 封装WebSocket连接逻辑
- ✅ 自动重连机制
- ✅ 心跳检测每30秒
- ✅ 状态管理status, progress, result, error
- ✅ 消息处理status, pong, error
#### 2.2 执行详情页面集成
- ✅ 实时显示执行状态
- ✅ 实时显示执行进度
- ✅ 实时显示执行结果
- ✅ 连接状态指示器
- ✅ 自动连接和断开
### 3. 路由和导航 ✅
- ✅ 添加执行历史路由 (`/executions`)
- ✅ 添加执行详情路由 (`/executions/:id`)
- ✅ 在工作流列表页面添加"执行历史"按钮
- ✅ 支持从工作流跳转到执行历史
### 4. 状态管理 ✅
- ✅ 创建执行状态管理Store (`execution.ts`)
- ✅ 支持获取执行列表
- ✅ 支持获取执行详情
- ✅ 支持创建执行任务
- ✅ 支持获取执行状态
## 📊 功能特性
### 执行历史列表
- **筛选功能**: 支持按工作流ID筛选执行记录
- **状态显示**: 使用不同颜色的标签显示执行状态
- **时间格式化**: 友好的时间显示格式
- **快速操作**: 点击行或按钮快速查看详情
### 执行详情页面
- **完整信息**: 显示执行的所有相关信息
- **数据展示**: JSON格式的输入输出数据易于阅读
- **实时更新**: WebSocket实时推送执行状态
- **进度显示**: 实时显示执行进度条
- **错误处理**: 清晰显示错误信息
### WebSocket实时推送
- **自动连接**: 执行进行中时自动建立连接
- **自动重连**: 连接断开时自动重连
- **心跳检测**: 保持连接活跃
- **状态同步**: WebSocket状态与Store状态自动同步
- **UI反馈**: 连接状态可视化指示
## 🎯 使用方式
### 查看执行历史
1. **从首页查看**:
- 在工作流列表中点击"执行历史"按钮
- 跳转到该工作流的执行历史页面
2. **直接访问**:
- 访问 `/executions` 查看所有执行记录
- 访问 `/executions?workflow_id=xxx` 查看特定工作流的执行记录
### 查看执行详情
1. **从执行历史**:
- 点击执行记录行或"查看详情"按钮
- 跳转到执行详情页面
2. **实时监控**:
- 如果执行正在进行页面会自动建立WebSocket连接
- 实时显示执行状态、进度和结果
- 执行完成后自动断开连接
## 🔧 技术实现
### 前端技术
- **Vue 3 Composition API**: 使用最新的组合式API
- **Pinia Store**: 状态管理
- **Element Plus**: UI组件库
- **WebSocket API**: 原生WebSocket API
- **TypeScript**: 类型安全
### 后端技术
- **FastAPI**: RESTful API
- **WebSocket**: FastAPI WebSocket支持
- **Celery**: 异步任务执行
- **MySQL**: 数据存储
## 📝 代码文件
### 新增文件
- `frontend/src/stores/execution.ts` - 执行状态管理
- `frontend/src/views/Executions.vue` - 执行历史列表
- `frontend/src/views/ExecutionDetail.vue` - 执行详情页面
- `frontend/src/composables/useWebSocket.ts` - WebSocket Composable
### 修改文件
- `frontend/src/router/index.ts` - 添加路由
- `frontend/src/views/Home.vue` - 添加执行历史按钮
- `backend/app/api/executions.py` - 修复响应模型datetime类型
## ✅ 测试建议
### 1. 执行历史列表测试
- [ ] 查看所有执行记录
- [ ] 按工作流ID筛选
- [ ] 点击查看详情
- [ ] 刷新列表
### 2. 执行详情页面测试
- [ ] 查看已完成执行的详情
- [ ] 查看失败执行的错误信息
- [ ] 查看输入输出数据格式
### 3. WebSocket实时推送测试
- [ ] 执行工作流时打开详情页面
- [ ] 观察实时状态更新
- [ ] 观察进度条变化
- [ ] 观察结果自动显示
- [ ] 测试连接断开和重连
## 🎉 完成度
- **第一阶段MVP**: 约 95% ✅
- **整体项目**: 约 55%
## 📋 下一步计划
1. **条件节点表达式解析** - 支持更复杂的条件判断
2. **数据转换节点完整实现** - 完善数据转换功能
3. **前端组件优化** - 优化UI和用户体验
4. **错误处理优化** - 更好的错误提示和处理
---
**完成时间**: 2024年
**状态**: ✅ 已完成并测试

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,194 @@
# 工作流模板和导入导出功能说明
## ✅ 已完成
已实现工作流模板功能、导入导出功能和执行历史优化。
## 功能特性
### 1. 工作流模板功能
#### 预设模板
系统提供4个预设模板
1. **简单LLM工作流** (`simple_llm`)
- 开始 → LLM → 结束
- 适合简单的LLM调用场景
2. **条件判断LLM工作流** (`conditional_llm`)
- 开始 → 条件判断 → [True分支LLM / False分支LLM] → 结束
- 适合根据条件调用不同LLM的场景
3. **数据转换+LLM工作流** (`data_transform_llm`)
- 开始 → 数据转换 → LLM → 结束
- 适合需要先转换数据再处理场景
4. **多LLM链式工作流** (`multi_llm_chain`)
- 开始 → LLM1 → LLM2 → LLM3 → 结束
- 适合需要多步LLM处理的场景
#### API端点
- `GET /api/v1/workflows/templates` - 获取模板列表
- `GET /api/v1/workflows/templates/{template_id}` - 获取模板详情
- `POST /api/v1/workflows/templates/{template_id}/create` - 从模板创建工作流
### 2. 工作流导入导出功能
#### 导出工作流
**API端点**: `GET /api/v1/workflows/{workflow_id}/export`
**响应格式**:
```json
{
"id": "workflow-id",
"name": "工作流名称",
"description": "工作流描述",
"nodes": [...],
"edges": [...],
"version": 1,
"status": "active",
"exported_at": "2024-01-17T01:00:00"
}
```
#### 导入工作流
**API端点**: `POST /api/v1/workflows/import`
**请求格式**:
```json
{
"name": "导入的工作流",
"description": "工作流描述",
"nodes": [...],
"edges": [...]
}
```
**特性**:
- 自动重新生成节点ID避免ID冲突
- 自动更新边的源节点和目标节点ID
- 自动验证工作流结构
- 验证失败时返回详细错误信息
### 3. 执行历史优化
#### 分页功能
- `skip`: 跳过记录数默认0
- `limit`: 每页记录数默认100最大100
#### 筛选功能
- `workflow_id`: 按工作流ID筛选
- `status`: 按状态筛选pending, running, completed, failed
#### 搜索功能
- `search`: 搜索关键词
- 搜索范围执行ID、工作流ID、任务ID
#### API端点
`GET /api/v1/executions?skip=0&limit=20&workflow_id=xxx&status=completed&search=keyword`
## 使用示例
### 1. 获取模板列表
```bash
curl -X GET "http://localhost:8037/api/v1/workflows/templates" \
-H "Authorization: Bearer {token}"
```
**响应**:
```json
[
{
"id": "simple_llm",
"name": "简单LLM工作流",
"description": "一个简单的LLM调用工作流..."
},
...
]
```
### 2. 从模板创建工作流
```bash
curl -X POST "http://localhost:8037/api/v1/workflows/templates/simple_llm/create?name=我的工作流" \
-H "Authorization: Bearer {token}"
```
### 3. 导出工作流
```bash
curl -X GET "http://localhost:8037/api/v1/workflows/{workflow_id}/export" \
-H "Authorization: Bearer {token}" \
-o workflow.json
```
### 4. 导入工作流
```bash
curl -X POST "http://localhost:8037/api/v1/workflows/import" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d @workflow.json
```
### 5. 获取执行历史(带筛选和搜索)
```bash
curl -X GET "http://localhost:8037/api/v1/executions?skip=0&limit=20&status=completed&search=test" \
-H "Authorization: Bearer {token}"
```
## 前端集成建议
### 模板选择界面
1. 显示模板列表(卡片式布局)
2. 点击模板查看详情
3. 一键从模板创建工作流
### 导入导出功能
1. **导出**
- 在工作流详情页添加"导出"按钮
- 点击后下载JSON文件
2. **导入**
- 在工作流列表页添加"导入"按钮
- 选择JSON文件上传
- 显示导入结果
### 执行历史优化
1. **分页组件**使用Element Plus的Pagination组件
2. **筛选器**:下拉选择状态、工作流
3. **搜索框**:实时搜索
4. **表格**:显示筛选和搜索后的结果
## 优势
1. **快速创建**:使用模板快速创建工作流
2. **工作流复用**:通过导入导出复用工作流
3. **高效查询**:执行历史支持分页、筛选、搜索
4. **数据安全**导入时自动重新生成ID避免冲突
## 后续计划
- [ ] 前端模板选择界面
- [ ] 前端导入导出功能
- [ ] 执行历史前端优化
- [ ] 模板市场(用户分享模板)
- [ ] 工作流版本对比
---
**状态**: ✅ 后端已完成
**时间**: 2024年

View File

@@ -0,0 +1,206 @@
# 工作流验证功能说明
## ✅ 已完成
已实现完整的工作流验证功能,确保工作流的正确性和完整性。
## 功能特性
### 1. 工作流验证器 (`backend/app/services/workflow_validator.py`)
- 节点验证检查节点ID唯一性、节点类型
- 边验证:检查边的源节点和目标节点是否存在
- 结构验证:检查是否有开始节点、结束节点
- 循环检测使用DFS算法检测工作流中的循环
- 可达性验证:检查所有节点是否从开始节点可达
- 连接验证:验证节点连接的正确性
- 配置验证:验证节点配置的完整性
### 2. 验证规则
#### 错误(会导致验证失败)
1. **缺少节点**:工作流必须包含至少一个节点
2. **节点ID重复**节点ID必须唯一
3. **缺少开始节点**:工作流必须包含至少一个开始节点
4. **循环检测**:工作流中不能存在循环
5. **边连接错误**:边的源节点或目标节点不存在
6. **自环检测**:节点不能连接到自身
#### 警告(不会导致验证失败)
1. **多个开始节点**:工作流包含多个开始节点
2. **缺少结束节点**:工作流建议包含至少一个结束节点
3. **不可达节点**:存在从开始节点不可达的节点
4. **开始节点入边**:开始节点不应该有入边
5. **结束节点出边**:结束节点不应该有出边
6. **条件节点分支**条件节点缺少True或False分支
7. **节点配置不完整**LLM节点缺少提示词或模型配置
## 使用方法
### 1. 后端API
#### 验证工作流(不保存)
```http
POST /api/v1/workflows/validate
Content-Type: application/json
Authorization: Bearer {token}
{
"name": "",
"nodes": [...],
"edges": [...]
}
```
**响应**:
```json
{
"valid": true,
"errors": [],
"warnings": ["工作流建议包含至少一个结束节点"]
}
```
#### 创建/更新工作流时自动验证
创建或更新工作流时,系统会自动验证工作流。如果验证失败,会返回错误信息。
### 2. 验证结果格式
```json
{
"valid": true, // 是否有效
"errors": [], // 错误列表(会导致验证失败)
"warnings": [] // 警告列表(不会导致验证失败)
}
```
## 验证示例
### 示例1: 有效的工作流
```json
{
"nodes": [
{"id": "start-1", "type": "start", "data": {"label": "开始"}},
{"id": "llm-1", "type": "llm", "data": {"label": "LLM", "prompt": "测试"}},
{"id": "end-1", "type": "end", "data": {"label": "结束"}}
],
"edges": [
{"id": "e1", "source": "start-1", "target": "llm-1"},
{"id": "e2", "source": "llm-1", "target": "end-1"}
]
}
```
**验证结果**: ✅ 通过
### 示例2: 缺少开始节点
```json
{
"nodes": [
{"id": "llm-1", "type": "llm", "data": {"label": "LLM"}},
{"id": "end-1", "type": "end", "data": {"label": "结束"}}
],
"edges": [
{"id": "e1", "source": "llm-1", "target": "end-1"}
]
}
```
**验证结果**: ❌ 失败
- 错误: `["工作流必须包含至少一个开始节点"]`
### 示例3: 循环检测
```json
{
"nodes": [
{"id": "start-1", "type": "start", "data": {"label": "开始"}},
{"id": "node-1", "type": "default", "data": {"label": "节点1"}},
{"id": "node-2", "type": "default", "data": {"label": "节点2"}}
],
"edges": [
{"id": "e1", "source": "start-1", "target": "node-1"},
{"id": "e2", "source": "node-1", "target": "node-2"},
{"id": "e3", "source": "node-2", "target": "node-1"} // 形成循环
]
}
```
**验证结果**: ❌ 失败
- 错误: `["检测到循环: node-2 -> node-1"]`
### 示例4: 条件节点分支验证
```json
{
"nodes": [
{"id": "start-1", "type": "start", "data": {"label": "开始"}},
{"id": "condition-1", "type": "condition", "data": {"label": "条件", "condition": "{value} > 10"}},
{"id": "end-1", "type": "end", "data": {"label": "结束"}}
],
"edges": [
{"id": "e1", "source": "start-1", "target": "condition-1"},
{"id": "e2", "source": "condition-1", "target": "end-1", "sourceHandle": "true"}
// 缺少false分支
]
}
```
**验证结果**: ✅ 通过(但有警告)
- 警告: `["条件节点 condition-1 缺少False分支"]`
## 测试结果
### 测试覆盖
- ✅ 有效工作流验证 (通过)
- ✅ 缺少开始节点检测 (通过)
- ✅ 循环检测 (通过)
- ✅ 不可达节点检测 (通过)
- ✅ 条件节点分支验证 (通过)
### 测试用例
1. **有效工作流**: 正常通过验证 ✅
2. **缺少开始节点**: 正确检测错误 ✅
3. **循环检测**: 正确检测循环 ✅
4. **不可达节点**: 正确生成警告 ✅
5. **条件节点**: 正确检测分支缺失 ✅
## 集成说明
### 自动验证
- 创建工作流时自动验证
- 更新工作流时自动验证
- 验证失败时阻止保存
### 手动验证
- 通过 `/api/v1/workflows/validate` 端点手动验证
- 不保存工作流,只返回验证结果
## 优势
1. **提前发现问题**:在保存前发现工作流问题
2. **详细错误信息**:提供清晰的错误和警告信息
3. **多种验证规则**:覆盖节点、边、结构、配置等多个方面
4. **区分错误和警告**:错误阻止保存,警告仅提示
## 后续计划
- [ ] 前端集成验证提示
- [ ] 实时验证(编辑时)
- [ ] 更多验证规则(数据流验证、类型检查等)
- [ ] 验证规则自定义
---
**状态**: ✅ 已完成
**时间**: 2024年

View File

@@ -0,0 +1,263 @@
# 数据转换节点功能说明
## ✅ 已完成
已实现完整的数据转换节点功能,支持字段映射、数据过滤、数据计算等多种转换模式。
## 功能特性
### 1. 数据转换服务 (`backend/app/services/data_transformer.py`)
- 字段映射:支持简单和嵌套字段映射
- 数据过滤:支持多种过滤规则
- 数据计算:支持表达式计算
- 嵌套路径访问:支持 `user.name``items[0].price`
### 2. 支持的转换模式
#### 字段映射 (mapping)
将源字段映射到目标字段
#### 数据过滤 (filter)
根据条件过滤数据
#### 数据计算 (compute)
使用表达式计算新字段
#### 全部 (all)
同时应用所有转换模式
## 使用方法
### 1. 在工作流中添加转换节点
1. 打开工作流设计器
2. 从节点工具箱拖拽"转换"节点到画布
3. 配置转换规则
### 2. 配置转换节点
#### 字段映射模式
**配置示例**:
```json
{
"mode": "mapping",
"mapping": {
"new_name": "old_name",
"new_age": "old_age",
"user_email": "email"
}
}
```
**输入**:
```json
{
"old_name": "张三",
"old_age": 25,
"email": "zhangsan@example.com"
}
```
**输出**:
```json
{
"new_name": "张三",
"new_age": 25,
"user_email": "zhangsan@example.com"
}
```
#### 嵌套字段映射
**配置示例**:
```json
{
"mode": "mapping",
"mapping": {
"user_name": "user.name",
"user_age": "user.profile.age",
"first_item_price": "items[0].price"
}
}
```
**输入**:
```json
{
"user": {
"name": "李四",
"profile": {
"age": 30
}
},
"items": [
{"id": 1, "price": 100},
{"id": 2, "price": 200}
]
}
```
**输出**:
```json
{
"user_name": "李四",
"user_age": 30,
"first_item_price": 100
}
```
#### 数据过滤模式
**配置示例**:
```json
{
"mode": "filter",
"filter_rules": [
{"field": "status", "operator": "==", "value": "active"},
{"field": "count", "operator": ">", "value": 10}
]
}
```
**支持的运算符**:
- `==`: 等于
- `!=`: 不等于
- `>`: 大于
- `>=`: 大于等于
- `<`: 小于
- `<=`: 小于等于
- `in`: 包含
- `not in`: 不包含
#### 数据计算模式
**配置示例**:
```json
{
"mode": "compute",
"compute_rules": {
"subtotal": "{price} * {quantity}",
"total": "({price} * {quantity}) * (1 - {discount})"
}
}
```
**输入**:
```json
{
"price": 100,
"quantity": 3,
"discount": 0.1
}
```
**输出**:
```json
{
"price": 100,
"quantity": 3,
"discount": 0.1,
"subtotal": 300,
"total": 270.0
}
```
## 前端配置
在节点配置面板中:
1. **选择转换模式**:字段映射、数据过滤、数据计算或全部
2. **配置映射规则**JSON格式的字段映射
3. **配置过滤规则**JSON数组格式的过滤规则
4. **配置计算规则**JSON格式的计算表达式
## 测试结果
### 测试覆盖
- ✅ 字段映射 (通过)
- ✅ 嵌套字段映射 (通过)
- ✅ 数据过滤 (通过)
- ✅ 数据计算 (通过)
- ✅ 工作流中的转换节点 (通过)
### 测试用例
1. **简单字段映射**: `{"username": "name"}`
2. **嵌套字段映射**: `{"user_name": "user.name"}`
3. **数组索引访问**: `{"first_item_price": "items[0].price"}`
4. **数据过滤**: 多条件过滤 ✅
5. **数据计算**: 复杂表达式计算 ✅
## 工作流示例
### 示例1: 数据格式转换
```
开始 → 转换节点(字段映射) → LLM节点 → 结束
```
转换节点配置:
```json
{
"mode": "mapping",
"mapping": {
"input_text": "raw_input",
"user_id": "id"
}
}
```
### 示例2: 数据预处理
```
开始 → 转换节点(过滤) → 条件节点 → [True] → LLM节点 → 结束
```
转换节点配置:
```json
{
"mode": "filter",
"filter_rules": [
{"field": "status", "operator": "==", "value": "active"}
]
}
```
### 示例3: 数据计算
```
开始 → 转换节点(计算) → 输出节点 → 结束
```
转换节点配置:
```json
{
"mode": "compute",
"compute_rules": {
"total": "{price} * {quantity}",
"discounted_price": "{total} * (1 - {discount})"
}
}
```
## 注意事项
1. **JSON格式**: 配置规则必须是有效的JSON格式
2. **字段路径**: 嵌套路径使用点号分隔,数组使用方括号
3. **表达式安全**: 计算表达式只支持安全的数学运算
4. **错误处理**: 如果转换失败,节点会返回错误信息
## 后续计划
- [ ] 支持更多转换函数(字符串处理、日期格式化等)
- [ ] 支持数组操作map、filter、reduce
- [ ] 可视化配置界面
- [ ] 转换规则模板
---
**状态**: ✅ 已完成
**时间**: 2024年

View File

@@ -0,0 +1,218 @@
# 条件节点功能说明
## ✅ 已完成
已实现强大的条件节点表达式解析功能,支持复杂的条件判断。
## 功能特性
### 1. 条件表达式解析器 (`backend/app/services/condition_parser.py`)
- 支持多种比较运算符
- 支持逻辑运算符and, or, not
- 支持括号分组
- 支持嵌套路径访问
- 安全的表达式评估
### 2. 支持的运算符
#### 比较运算符
- `==`: 等于
- `!=`: 不等于
- `>`: 大于
- `>=`: 大于等于
- `<`: 小于
- `<=`: 小于等于
- `in`: 包含
- `not in`: 不包含
- `contains`: 字符串包含
- `not contains`: 字符串不包含
#### 逻辑运算符
- `and`: 逻辑与
- `or`: 逻辑或
- `not`: 逻辑非
### 3. 工作流引擎集成
- 条件节点根据表达式结果选择分支
- 动态过滤执行路径
- 只执行符合条件的分支节点
## 使用方法
### 1. 在工作流中添加条件节点
1. 打开工作流设计器
2. 从节点工具箱拖拽"条件"节点到画布
3. 配置条件表达式
### 2. 配置条件表达式
在节点配置面板中,输入条件表达式:
#### 简单条件
```
{value} > 10
{status} == 'active'
{count} >= 0
```
#### 逻辑组合
```
{value} > 10 and {value} < 20
{status} == 'active' or {status} == 'pending'
```
#### 复杂条件(括号分组)
```
({value} > 10 and {value} < 20) and {status} == 'active'
({status} == 'a' or {status} == 'b') and {count} > 0
```
### 3. 连接分支
条件节点有两个输出:
- **True分支**(绿色):条件为真时执行
- **False分支**(红色):条件为假时执行
连接方式:
1. 从条件节点的底部连接点拖出
2. 选择True或False分支
3. 连接到目标节点
## 表达式语法
### 变量引用
使用 `{key}` 引用输入数据中的字段:
```
{value} > 10
{user.name} == 'admin'
{items[0].price} > 100
```
### 值类型
支持多种值类型:
- **数字**: `10`, `3.14`
- **字符串**: `'active'`, `"pending"`
- **布尔值**: `true`, `false`
- **None**: `null`, `None`
### 嵌套路径
支持访问嵌套数据:
- `{user.name}`: 访问 `user.name`
- `{items[0]}`: 访问数组第一个元素
- `{items[0].price}`: 访问嵌套对象
## 示例
### 示例1: 数值范围判断
```
条件表达式: {value} > 10 and {value} < 20
输入: {"value": 15}
结果: True → 走True分支
输入: {"value": 5}
结果: False → 走False分支
```
### 示例2: 状态判断
```
条件表达式: {status} == 'active' or {status} == 'pending'
输入: {"status": "active"}
结果: True → 走True分支
输入: {"status": "inactive"}
结果: False → 走False分支
```
### 示例3: 复杂条件
```
条件表达式: ({value} > 10 and {value} < 20) and {status} == 'active'
输入: {"value": 15, "status": "active"}
结果: True → 走True分支
输入: {"value": 15, "status": "inactive"}
结果: False → 走False分支
```
### 示例4: 字符串包含
```
条件表达式: {message} contains 'error'
输入: {"message": "发生错误"}
结果: True → 走True分支
输入: {"message": "成功"}
结果: False → 走False分支
```
## 工作流示例
### 示例工作流:条件分支处理
```
开始 → LLM节点(分析) → 条件节点(判断) → [True] → 输出节点1
→ [False] → 输出节点2
```
**配置**:
1. LLM节点: 分析输入数据,返回结果
2. 条件节点: `{result} contains 'error'`
3. True分支: 处理错误情况
4. False分支: 处理正常情况
## 测试结果
### 测试覆盖
- ✅ 简单条件表达式 (8/8通过)
- ✅ 逻辑组合条件 (6/6通过)
- ✅ 复杂条件表达式 (4/4通过)
- ✅ 工作流中的条件节点 (通过)
### 测试用例
1. **数值比较**: `{value} > 10`, `{value} == 10`
2. **字符串比较**: `{status} == 'active'`
3. **逻辑组合**: `{value} > 10 and {value} < 20`
4. **或运算**: `{status} == 'active' or {status} == 'pending'`
5. **括号分组**: `({value} > 10 and {value} < 20) and {status} == 'active'`
## 注意事项
1. **变量名**: 使用 `{key}` 格式key必须存在于输入数据中
2. **字符串值**: 字符串值需要用引号包裹:`'active'``"active"`
3. **运算符优先级**: `not` > `and` > `or`,可以使用括号改变优先级
4. **分支选择**: 条件节点会根据表达式结果自动选择True或False分支
5. **错误处理**: 如果表达式评估失败默认返回False
## 安全特性
- 使用安全的表达式评估(限制可用的内置函数)
- 不支持危险的Python操作
- 只允许访问输入数据中的字段
- 自动处理类型转换
## 后续计划
- [ ] 支持更多运算符(如正则匹配)
- [ ] 支持函数调用(如 `len({items}) > 0`
- [ ] 支持数组操作(如 `{items}.length > 0`
- [ ] 可视化条件表达式编辑器
---
**状态**: ✅ 已完成
**时间**: 2024年

View File

@@ -0,0 +1,186 @@
# 节点测试功能使用说明
## ✅ 已修复的问题
1. **输出为 null 的问题**
- 修复了后端未正确处理节点执行失败的情况
- 现在会正确显示错误信息,而不是只显示 `null`
2. **错误信息显示**
- 改进了错误信息的传递和显示
- 前端会清晰显示具体的错误原因
## 🔧 配置检查
### DeepSeek API 配置
已在 `docker-compose.dev.yml` 中配置:
```yaml
environment:
- DEEPSEEK_API_KEY=sk-fdf7cc1c73504e628ec0119b7e11b8cc
- DEEPSEEK_BASE_URL=https://api.deepseek.com
```
### 验证配置是否生效
1. **检查后端服务状态**
```bash
docker-compose -f docker-compose.dev.yml ps
```
2. **验证 API Key 是否加载**
```bash
docker-compose -f docker-compose.dev.yml exec backend python -c "from app.core.config import settings; print('DeepSeek API Key:', '已配置' if settings.DEEPSEEK_API_KEY else '❌ 未配置')"
```
3. **查看后端日志**
```bash
docker-compose -f docker-compose.dev.yml logs --tail=50 backend
```
## 📝 使用步骤
### 1. 打开 Agent 设计器
1. 登录系统
2. 点击导航栏的"Agent管理"
3. 选择一个 Agent点击"设计"按钮
### 2. 配置 LLM 节点
1. 点击画布上的 LLM 节点(或添加新节点)
2. 在右侧配置面板中设置:
- **提供商**: 选择 "DeepSeek"
- **模型**: 选择 "DeepSeek Chat" 或 "DeepSeek Coder"
- **提示词**: 输入提示词,例如:`请处理用户请求:{input}`
- **温度**: 0.5-0.7(推荐)
- **最大Token数**: 1500根据需要调整
3. 点击"保存配置"按钮
### 3. 测试节点
1. 在"节点测试"区域:
- **测试输入**: 编辑 JSON 格式的测试数据
- 默认输入示例:
```json
{
"input": "你好",
"query": "你好"
}
```
2. 点击"运行测试"按钮
3. 查看测试结果:
- **测试输出**: 显示 LLM 返回的内容
- **状态**: 显示成功/失败状态
- **执行时间**: 显示耗时(毫秒)
- **错误信息**: 如果失败,会显示具体错误
## 🎯 测试示例
### 示例 1简单对话
**节点配置**
- 提供商: DeepSeek
- 模型: DeepSeek Chat
- 提示词: `请回答用户的问题:{input}`
**测试输入**
```json
{
"input": "你好,介绍一下你自己"
}
```
**预期输出**
DeepSeek 的回复内容
### 示例 2文本处理
**节点配置**
- 提供商: DeepSeek
- 模型: DeepSeek Chat
- 提示词: `请将以下文本翻译成英文:{input}`
**测试输入**
```json
{
"input": "你好,世界"
}
```
**预期输出**
"Hello, World"
## ⚠️ 常见问题
### 1. 输出为 null
**可能原因**
- API Key 未配置或配置错误
- 模型名称不匹配
- 网络连接问题
- API 返回空内容
**解决方法**
1. 检查 `docker-compose.dev.yml` 中的 `DEEPSEEK_API_KEY` 配置
2. 确认模型名称是 `deepseek-chat` 或 `deepseek-coder`
3. 查看后端日志获取详细错误信息
4. 重启后端服务:
```bash
docker-compose -f docker-compose.dev.yml restart backend
```
### 2. 显示错误信息
现在如果测试失败,会显示具体的错误信息,例如:
- `DeepSeek API Key未配置请在环境变量中设置DEEPSEEK_API_KEY`
- `DeepSeek API调用失败: ...`
- `DeepSeek API返回的内容为空请检查API配置和模型名称`
根据错误信息进行相应的修复。
### 3. 测试超时
如果测试时间过长:
1. 检查网络连接
2. 减少 `max_tokens` 的值
3. 检查 API 服务状态
## 🔄 重启服务
如果修改了配置,需要重启后端服务:
```bash
docker-compose -f docker-compose.dev.yml restart backend
```
## 📊 功能特点
1. **实时测试**:边编排边测试,无需保存即可验证节点功能
2. **输入编辑**:支持自定义 JSON 格式的测试输入
3. **输出查看**:实时查看节点输出结果
4. **错误提示**:清晰的错误信息,便于调试
5. **执行时间**:显示节点执行耗时
## 🎨 界面说明
- **左侧面板**:节点配置和测试区域
- 节点配置表单
- 测试输入编辑框
- 运行测试按钮
- 测试输出显示框
- **右侧面板**Agent 预览和测试结果
- Agent 信息展示
- 节点测试结果(输入/输出)
- 实时对话预览
## 💡 提示
1. **测试前保存配置**:建议先点击"保存配置"再测试
2. **输入格式**:确保测试输入是有效的 JSON 格式
3. **多次测试**:可以修改输入数据,多次测试验证不同场景
4. **查看日志**:如果遇到问题,查看后端日志获取详细信息

View File

@@ -0,0 +1,107 @@
# 节点连接使用说明
## ✅ 节点连接功能已实现
现在所有节点都可以正常连接了!
## 🔗 如何连接节点
### 方法1拖拽连接推荐
1. **将鼠标悬停在节点的连接点上**
- 开始节点:底部有绿色连接点
- LLM/输入/转换/输出节点:顶部和底部都有连接点
- 条件节点顶部有输入点底部有两个输出点true/false
- 结束节点:顶部有红色连接点
2. **点击并拖拽连接点**
- 从源节点的输出点(底部)拖拽
- 拖到目标节点的输入点(顶部)
- 释放鼠标完成连接
3. **连接线会自动创建**
- 连接线是蓝色的,带有动画效果
- 连接线是平滑的曲线smoothstep类型
### 方法2点击连接点
1. 点击源节点的输出连接点
2. 然后点击目标节点的输入连接点
3. 连接会自动创建
## 📋 节点连接规则
### 开始节点
- ✅ 只有输出(底部)
- ✅ 可以连接到LLM、输入、条件、转换、输出节点
### LLM节点
- ✅ 有输入(顶部)和输出(底部)
- ✅ 可以接收:开始、输入、条件、转换节点的输出
- ✅ 可以连接到:条件、转换、输出、结束节点
### 条件节点
- ✅ 有输入(顶部)和两个输出(底部)
- 左侧输出true分支绿色
- 右侧输出false分支红色
- ✅ 可以接收开始、LLM、输入、转换节点的输出
- ✅ 可以连接到LLM、转换、输出、结束节点
### 输入/转换/输出节点
- ✅ 有输入(顶部)和输出(底部)
- ✅ 可以接收开始、LLM、条件、转换节点的输出
- ✅ 可以连接到LLM、条件、转换、输出、结束节点
### 结束节点
- ✅ 只有输入(顶部)
- ✅ 可以接收:所有有输出的节点
## 🎨 连接点样式
- **输入点(顶部)**:小圆点,颜色与节点颜色一致
- **输出点(底部)**:小圆点,颜色与节点颜色一致
- **条件节点输出点**
- true分支绿色
- false分支红色
## 🗑️ 删除连接
1. **点击连接线**:连接线会高亮显示
2. **按Delete键**:删除选中的连接线
3. **或通过代码**:在 `onEdgeClick` 事件中实现删除功能
## 💡 提示
1. **连接点位置**
- 输入点在节点顶部中心
- 输出点在节点底部中心
- 条件节点有两个输出点(左右分布)
2. **连接验证**
- Vue Flow会自动验证连接是否有效
- 不能连接到自己的输入点
- 不能创建重复的连接
3. **连接保存**
- 连接会自动保存到工作流数据中
- 点击"保存"按钮会保存所有节点和连接
## 🐛 如果连接不工作
1. **检查节点是否有连接点**
- 刷新页面后,节点应该显示连接点(小圆点)
- 如果看不到连接点,检查浏览器控制台是否有错误
2. **检查Vue Flow样式**
- 确保已导入Vue Flow的CSS样式
- 连接点需要样式才能正确显示
3. **检查控制台**
- 打开浏览器控制台F12
- 查看是否有"连接节点"的日志
- 查看是否有错误信息
---
**状态**: ✅ 已实现
**最后更新**: 2024年

View File

@@ -0,0 +1,276 @@
# 节点配置页面增强功能完成情况
## 📊 总体完成度:约 95%
---
## ✅ 已完成功能
### 1. 变量自动补全功能 ⭐⭐⭐⭐⭐ ✅
**完成度100%**
**实现位置**
- 文件:`frontend/src/components/WorkflowEditor/WorkflowEditor.vue`
- 行数3562-3778行
**已实现功能**
- ✅ 输入 `{{` 时自动弹出变量选择器
- ✅ 支持键盘导航上下箭头、Enter、Tab、Escape
- ✅ 支持鼠标点击选择
- ✅ 实时过滤变量(根据输入内容)
- ✅ 显示变量类型和描述
- ✅ 自动定位下拉框位置
- ✅ 支持基础变量、上游变量、记忆变量
**核心代码**
```javascript
// 处理提示词输入,检测 {{ 触发自动补全
const handlePromptInput = () => {
// 检测 {{ 并显示自动补全下拉框
}
// 键盘导航支持
const handlePromptKeydown = (event: KeyboardEvent) => {
// 支持上下箭头、Enter、Tab、Escape
}
// 选择变量并插入
const selectAutocompleteVariable = (variableName: string) => {
// 替换 {{ 到光标位置的内容为 {{variableName}}
}
```
---
### 2. 上游节点的实时数据预览 ⭐⭐⭐⭐⭐ ✅
**完成度100%**
**实现位置**
- 标签页:`数据流` (name="dataflow")
- 文件:`frontend/src/components/WorkflowEditor/WorkflowEditor.vue`
- 行数1521-1550行
**已实现功能**
- ✅ 在数据流面板中显示上游节点的实际输出数据
- ✅ 支持选择执行记录查看数据
- ✅ 显示JSON格式化的数据
- ✅ 支持折叠展开查看
- ✅ 自动检测是否有执行数据
**核心代码**
```vue
<!-- 数据预览如果有执行记录 -->
<el-collapse v-if="hasUpstreamExecutionData(edge.source)">
<el-collapse-item title="数据预览" name="preview">
<el-select
:model-value="upstreamExecutionDataMap[edge.source]?.executionId"
@update:model-value="(value) => updateUpstreamExecutionId(edge.source, value)"
placeholder="选择执行记录"
>
<!-- 执行记录列表 -->
</el-select>
<!-- 数据展示 -->
</el-collapse-item>
</el-collapse>
```
---
### 3. 缓存命中情况显示 ⭐⭐⭐⭐⭐ ✅
**完成度100%**
**实现位置**
- 标签页:`数据预览` (name="preview")
- 文件:`frontend/src/components/WorkflowEditor/WorkflowEditor.vue`
- 行数1809-1837行
**已实现功能**
- ✅ 在执行数据预览中显示缓存命中信息
- ✅ 显示缓存命中状态(✅ 命中 / ❌ 未命中)
- ✅ 显示缓存时间(如果命中)
- ✅ 支持Cache节点和输出中包含cache_hit的节点
**核心代码**
```vue
<!-- 缓存命中情况 -->
<el-form-item
v-if="selectedNode?.type === 'cache' || executionData?.output?.cache_hit !== undefined"
label="缓存命中"
>
<el-tag :type="executionData?.output?.cache_hit ? 'success' : 'info'">
{{ executionData?.output?.cache_hit ? '✅ 命中' : '❌ 未命中' }}
</el-tag>
<span v-if="executionData?.output?.cache_hit">
缓存时间: {{ formatTime(executionData.output.cache_time) }}
</span>
</el-form-item>
```
---
### 4. 场景化配置向导 ⭐⭐⭐⭐⭐ ✅
**完成度100%**
**实现位置**
- 标签页:`智能助手` (name="assistant")
- 文件:`frontend/src/components/WorkflowEditor/WorkflowEditor.vue`
- 行数2215-2299行
**已实现功能**
- ✅ 分步骤引导用户完成配置
- ✅ 三步向导:选择场景 → 配置参数 → 完成
- ✅ 根据节点类型提供不同场景
- ✅ 动态表单生成支持text、textarea、select、number等类型
- ✅ 配置应用和验证
**核心代码**
```vue
<!-- 向导模式 -->
<div v-else-if="configAssistantMode === 'wizard'" class="wizard-mode">
<el-steps :active="wizardStep" simple>
<el-step title="选择场景" />
<el-step title="配置参数" />
<el-step title="完成" />
</el-steps>
<!-- 场景选择 -->
<div v-if="wizardStep === 0">
<!-- 场景列表 -->
</div>
<!-- 参数配置 -->
<div v-if="wizardStep === 1">
<!-- 动态表单 -->
</div>
<!-- 完成 -->
<div v-if="wizardStep === 2">
<!-- 完成提示 -->
</div>
</div>
```
---
### 5. 完整的配置模板库 ⭐⭐⭐⭐⭐ ✅
**完成度100%**
**实现位置**
- 标签页:`智能助手` (name="assistant") - 模板模式
- 文件:`frontend/src/components/WorkflowEditor/WorkflowEditor.vue`
- 行数2141-2212行
**已实现功能**
- ✅ 模板搜索功能
- ✅ 模板分类筛选全部、常用、AI、数据处理、网络
- ✅ 模板收藏功能(⭐ 收藏/取消收藏)
- ✅ 模板列表展示(名称、描述、分类、预览)
- ✅ 模板应用功能
- ✅ 模板详情查看
- ✅ 模板导出功能
**核心代码**
```vue
<!-- 模板模式 -->
<div v-else-if="configAssistantMode === 'template'" class="template-selector">
<!-- 搜索和分类筛选 -->
<div style="display: flex; gap: 10px;">
<el-input
v-model="configTemplateSearchKeyword"
placeholder="搜索模板..."
/>
<el-select
v-model="templateCategoryFilter"
placeholder="分类"
>
<el-option label="全部" value="" />
<el-option label="常用" value="common" />
<!-- 更多分类 -->
</el-select>
</div>
<!-- 模板列表 -->
<el-scrollbar height="400px">
<div class="template-list">
<div
v-for="template in filteredConfigTemplates"
class="template-item"
:class="{ 'is-favorite': template.isFavorite }"
>
<!-- 模板头部名称分类收藏按钮 -->
<!-- 模板描述 -->
<!-- 模板预览 -->
<!-- 模板操作应用查看详情导出 -->
</div>
</div>
</el-scrollbar>
</div>
```
---
## 📋 功能清单总结
| 功能 | 状态 | 完成度 | 说明 |
|------|------|--------|------|
| 变量自动补全功能 | ✅ | 100% | 输入 `{{` 时自动提示变量,支持键盘导航 |
| 上游节点的实时数据预览 | ✅ | 100% | 在数据流面板中显示上游节点的实际输出数据 |
| 缓存命中情况显示 | ✅ | 100% | 在执行数据预览中显示缓存命中信息 |
| 场景化配置向导 | ✅ | 100% | 分步骤引导用户完成配置 |
| 完整的配置模板库 | ✅ | 100% | 模板搜索、分类、收藏、应用功能 |
---
## 🎉 已实现的亮点功能
1. **智能变量自动补全** - 输入 `{{` 时自动弹出变量选择器,支持键盘导航和实时过滤
2. **实时数据预览** - 在数据流面板中可以直接查看上游节点的实际输出数据
3. **缓存命中可视化** - 清晰显示缓存命中状态和时间信息
4. **场景化配置向导** - 三步向导引导用户完成复杂节点配置
5. **完整模板库** - 支持搜索、分类、收藏、预览、应用的模板管理系统
---
## 📊 完成度统计
| 优先级 | 功能模块 | 完成度 | 状态 |
|--------|----------|--------|------|
| 高 | 变量自动补全功能 | 100% | ✅ 已完成 |
| 高 | 上游节点数据预览 | 100% | ✅ 已完成 |
| 高 | 缓存命中情况显示 | 100% | ✅ 已完成 |
| 中 | 场景化配置向导 | 100% | ✅ 已完成 |
| 中 | 配置模板库 | 100% | ✅ 已完成 |
**总体完成度100%**
---
## 🎯 后续优化建议(可选)
虽然所有功能都已实现,但可以考虑以下优化:
1. **模板库增强**
- 支持模板导入/导出JSON格式
- 支持模板分享和社区模板
- 支持模板版本管理
2. **向导增强**
- 支持更多节点类型的向导
- 支持自定义向导场景
- 支持向导步骤回退和保存
3. **数据预览增强**
- 支持数据对比(不同执行记录)
- 支持数据可视化(图表展示)
- 支持数据导出
---
**最后更新**: 2026-01-23
**文档版本**: v2.0
**状态**: 所有功能已完成 ✅

View File

@@ -0,0 +1,260 @@
# 节点配置页面增强方案 - 完成情况报告
## 📊 总体完成度:约 75%
---
## ✅ 已完成功能(高优先级)
### 1. 数据流转可视化面板 ⭐⭐⭐⭐⭐
**完成度85%**
| 功能点 | 状态 | 说明 |
|--------|------|------|
| ✅ 显示上游节点的输出变量 | **已完成** | 在"数据流"标签页中显示所有上游节点及其输出变量 |
| ✅ 显示数据流转路径 | **已完成** | 显示上游节点列表和下游节点列表,清晰展示数据流转 |
| ⚠️ 提供数据预览功能 | **部分完成** | 有独立的"数据预览"标签页,但数据流面板中上游节点的实时数据预览未实现 |
| ✅ 一键插入变量 | **已完成** | 点击变量标签即可插入到配置字段 |
**实现位置:**
- 标签页:`数据流` (name="dataflow")
- 文件:`frontend/src/components/WorkflowEditor/WorkflowEditor.vue` (1439-1530行)
**已实现功能:**
- ✅ 上游节点列表展示
- ✅ 上游节点输出变量展示(带类型和描述)
- ✅ 当前节点输出字段说明
- ✅ 下游节点列表展示
- ✅ 变量一键插入功能
**待完善:**
- ⚠️ 上游节点的实时数据预览(需要执行记录)
---
### 2. 记忆信息展示 ⭐⭐⭐⭐⭐
**完成度100%**
| 功能点 | 状态 | 说明 |
|--------|------|------|
| ✅ 实时显示记忆内容 | **已完成** | 通过API获取并显示记忆数据 |
| ✅ 对话历史预览 | **已完成** | 对话框形式展示完整对话历史 |
| ✅ 用户画像展示 | **已完成** | 表格形式展示用户画像字段 |
| ✅ TTL 和过期时间 | **已完成** | 自动计算并显示过期时间(天/小时/分钟) |
**实现位置:**
- 标签页:`记忆信息` (name="memory",仅 Cache 节点显示)
- 文件:`frontend/src/components/WorkflowEditor/WorkflowEditor.vue` (1532-1644行)
- 后端API`backend/app/api/execution_logs.py` (缓存查询接口)
**已实现功能:**
- ✅ 记忆键显示
- ✅ 记忆状态显示(存在/不存在)
- ✅ 对话历史统计和详情查看
- ✅ 用户画像统计和详情查看
- ✅ TTL 信息显示
- ✅ 刷新记忆功能连接实际API
- ✅ 删除记忆功能
- ✅ 清空记忆功能
**后端API**
-`GET /api/v1/execution-logs/cache/{key}` - 获取缓存值
-`DELETE /api/v1/execution-logs/cache/{key}` - 删除缓存值
---
### 3. 变量智能提示增强 ⭐⭐⭐⭐⭐
**完成度80%**
| 功能点 | 状态 | 说明 |
|--------|------|------|
| ✅ 按来源分组显示变量 | **已完成** | 基础变量、上游节点变量、记忆变量分组显示 |
| ✅ 类型提示和描述 | **已完成** | 不同变量类型用不同颜色标签,鼠标悬停显示描述 |
| ❌ 自动补全功能 | **未实现** | 输入 `{{` 时自动提示变量(需要实现) |
| ✅ 一键插入变量 | **已完成** | 点击变量标签直接插入到提示词字段 |
**实现位置:**
- 标签页:`基础` (name="basic") - LLM节点提示词字段下方
- 文件:`frontend/src/components/WorkflowEditor/WorkflowEditor.vue` (396-476行)
**已实现功能:**
- ✅ 变量分组显示(基础变量、上游变量、记忆变量)
- ✅ 变量类型标签(不同颜色区分)
- ✅ 变量描述提示Tooltip
- ✅ 一键插入变量功能
- ✅ 可折叠面板
**待完善:**
- ❌ 自动补全:输入 `{{` 时自动弹出变量选择器
---
## ⚠️ 部分完成功能(中优先级)
### 4. 执行时数据预览 ⭐⭐⭐⭐
**完成度70%**
| 功能点 | 状态 | 说明 |
|--------|------|------|
| ✅ 显示实际输入/输出数据 | **已完成** | JSON格式化显示节点的输入和输出数据 |
| ✅ 执行时间和状态 | **已完成** | 显示执行时间、开始时间、完成时间 |
| ❌ 缓存命中情况 | **未实现** | 未显示缓存命中信息 |
**实现位置:**
- 标签页:`数据预览` (name="preview")
- 文件:`frontend/src/components/WorkflowEditor/WorkflowEditor.vue` (1645-1783行)
- 后端API`backend/app/api/execution_logs.py` (节点执行数据接口)
**已实现功能:**
- ✅ 执行记录选择器
- ✅ 输入数据展示JSON格式化
- ✅ 输出数据展示JSON格式化
- ✅ 执行时间信息
- ✅ 复制到剪贴板功能
- ✅ 自动加载最近的执行记录
**后端API**
-`GET /api/v1/execution-logs/executions/{execution_id}/nodes/{node_id}/data` - 获取节点执行数据
**待完善:**
- ❌ 缓存命中情况显示(需要从执行日志中提取 cache_hit 信息)
---
## ❌ 未实现功能(低优先级)
### 5. 智能配置助手 ⭐⭐⭐⭐
**完成度30%**
| 功能点 | 状态 | 说明 |
|--------|------|------|
| ❌ 场景化配置向导 | **未实现** | 分步骤引导用户完成配置 |
| ⚠️ 配置模板库 | **部分实现** | 有快速模板功能,但不是完整的模板库 |
| ✅ 一键应用模板 | **已完成** | 快速模板可以一键应用 |
**已实现功能:**
- ✅ 快速模板选择(在"基础"标签页中)
- ✅ 模板一键应用功能
- ✅ 支持多种节点类型的模板HTTP、LLM、JSON、文本、缓存等
**待实现:**
- ❌ 场景化配置向导(分步骤引导)
- ❌ 完整的配置模板库(分类、搜索、收藏等)
- ❌ 配置模板的导入/导出功能
---
## 📋 详细功能清单
### ✅ 已实现的核心功能
1. **数据流转可视化**
- ✅ 上游节点列表
- ✅ 上游节点变量展示
- ✅ 输出字段说明
- ✅ 下游节点列表
- ✅ 变量一键插入
2. **记忆信息管理**
- ✅ 记忆内容实时查看
- ✅ 对话历史预览
- ✅ 用户画像展示
- ✅ TTL 信息显示
- ✅ 记忆操作(刷新、删除、清空)
3. **变量智能提示**
- ✅ 变量分组显示
- ✅ 类型和描述提示
- ✅ 一键插入功能
4. **执行数据预览**
- ✅ 输入/输出数据展示
- ✅ 执行时间信息
- ✅ 执行记录选择
5. **基础功能**
- ✅ 快速模板功能
- ✅ 节点测试功能(已移到独立标签页)
### ⚠️ 待完善的功能
1. **数据流转可视化**
- ⚠️ 上游节点的实时数据预览(需要执行记录支持)
2. **变量智能提示**
- ❌ 自动补全功能(输入 `{{` 时自动提示)
3. **执行数据预览**
- ❌ 缓存命中情况显示
4. **智能配置助手**
- ❌ 场景化配置向导
- ❌ 完整的配置模板库
---
## 🎯 下一步建议
### 高优先级(建议优先完成)
1. **变量自动补全功能**
- 实现输入 `{{` 时自动弹出变量选择器
- 支持键盘导航和选择
- 预计时间2-3小时
2. **上游节点数据预览**
- 在数据流面板中显示上游节点的实际输出数据
- 需要从执行记录中提取数据
- 预计时间2-3小时
3. **缓存命中情况显示**
- 在执行数据预览中显示缓存命中信息
- 需要从执行日志中提取 cache_hit 字段
- 预计时间1-2小时
### 中优先级(后续优化)
4. **场景化配置向导**
- 为复杂节点提供分步骤配置向导
- 根据使用场景提供预设配置
- 预计时间4-6小时
5. **配置模板库**
- 完整的模板管理系统
- 模板分类、搜索、收藏功能
- 预计时间6-8小时
---
## 📊 完成度统计
| 优先级 | 功能模块 | 完成度 | 状态 |
|--------|----------|--------|------|
| 高 | 数据流转可视化面板 | 85% | ✅ 基本完成 |
| 高 | 记忆信息展示 | 100% | ✅ 已完成 |
| 高 | 变量智能提示增强 | 80% | ✅ 基本完成 |
| 中 | 执行时数据预览 | 70% | ⚠️ 部分完成 |
| 低 | 智能配置助手 | 30% | ❌ 待实现 |
**总体完成度:约 75%**
---
## 🎉 已实现的亮点功能
1. **完整的数据流转可视化** - 用户可以清楚看到数据如何流转
2. **实时记忆信息管理** - Cache 节点可以实时查看和管理记忆
3. **智能变量提示** - 分组显示、类型提示、一键插入
4. **执行数据预览** - 查看实际执行时的输入/输出数据
5. **后端API完整支持** - 所有功能都有对应的后端API支持
---
**文档版本**v1.0
**更新时间**2024年
**维护人员**AI Assistant

View File

@@ -0,0 +1,632 @@
# 节点配置页面增强方案
## 一、您的想法完全正确!
您的建议非常有价值,这正是提升用户体验和开发效率的关键改进点。当前系统虽然有一些基础功能,但确实需要增强以下方面:
### 当前系统的不足
1. **变量可见性不足**
- 虽然有 `availableVariables` 计算属性,但用户看不到:
- 上游节点实际输出了哪些变量
- 变量的数据结构(嵌套字段)
- 变量的实时值(执行时)
2. **记忆信息不直观**
- Cache 节点配置时,用户看不到:
- 当前记忆的内容conversation_history、user_profile
- 记忆的键名和存储位置
- TTL 和过期时间
3. **数据流转不透明**
- 用户不知道:
- 数据从哪个节点来
- 经过哪些转换
- 最终输出什么格式
4. **配置指导不足**
- 缺少:
- 节点使用示例
- 常见配置模式
- 最佳实践提示
## 二、增强方案设计
### 方案 1数据流转可视化面板 ⭐⭐⭐⭐⭐
#### 1.1 新增"数据流"标签页
在节点配置面板中添加"数据流"标签页,显示:
```vue
<el-tab-pane label="数据流" name="dataflow">
<!-- 上游数据源 -->
<el-card shadow="never" class="dataflow-card">
<template #header>
<div class="card-header">
<span>📥 输入数据源</span>
<el-tag size="small" type="info">{{ upstreamNodes.length }} 个上游节点</el-tag>
</div>
</template>
<!-- 上游节点列表 -->
<div v-for="edge in upstreamEdges" :key="edge.id" class="upstream-item">
<div class="node-info">
<el-icon><ArrowLeft /></el-icon>
<span class="node-name">{{ getNodeLabel(edge.source) }}</span>
<el-tag size="small" :type="getNodeTypeColor(edge.source)">
{{ getNodeType(edge.source) }}
</el-tag>
</div>
<!-- 可用变量列表 -->
<div class="variables-list">
<div
v-for="var in getUpstreamVariables(edge.source)"
:key="var.name"
class="variable-item"
@click="insertVariable(var.name)"
>
<el-icon><Document /></el-icon>
<span class="var-name">{{ var.name }}</span>
<span class="var-type">{{ var.type }}</span>
<el-tooltip :content="var.description" placement="right">
<el-icon><InfoFilled /></el-icon>
</el-tooltip>
</div>
</div>
<!-- 数据预览如果有执行记录 -->
<el-collapse v-if="hasExecutionData(edge.source)">
<el-collapse-item title="数据预览" name="preview">
<pre class="data-preview">{{ formatExecutionData(edge.source) }}</pre>
</el-collapse-item>
</el-collapse>
</div>
</el-card>
<!-- 当前节点输出 -->
<el-card shadow="never" class="dataflow-card">
<template #header>
<div class="card-header">
<span>📤 输出数据</span>
</div>
</template>
<!-- 输出字段说明 -->
<div class="output-fields">
<div
v-for="field in getOutputFields(selectedNode.type)"
:key="field.name"
class="output-field"
>
<span class="field-name">{{ field.name }}</span>
<span class="field-desc">{{ field.description }}</span>
</div>
</div>
<!-- 下游节点 -->
<div v-if="downstreamNodes.length > 0" class="downstream-section">
<div class="section-title">下游节点</div>
<div
v-for="node in downstreamNodes"
:key="node.id"
class="downstream-item"
>
<el-icon><ArrowRight /></el-icon>
<span>{{ node.data.label }}</span>
</div>
</div>
</el-card>
</el-tab-pane>
```
#### 1.2 功能特性
- **上游节点追踪**:显示所有连接到当前节点的上游节点
- **变量自动推断**:根据上游节点类型自动推断可用变量
- **数据预览**:如果有执行记录,显示实际数据
- **一键插入**:点击变量名直接插入到配置字段
- **类型提示**:显示变量的数据类型和结构
### 方案 2记忆信息展示 ⭐⭐⭐⭐⭐
#### 2.1 Cache 节点增强
对于 Cache 节点,显示详细的记忆信息:
```vue
<el-tab-pane label="记忆信息" name="memory" v-if="selectedNode.type === 'cache'">
<!-- 当前记忆内容 -->
<el-card shadow="never">
<template #header>
<div class="card-header">
<span>💾 记忆内容</span>
<el-button size="small" @click="refreshMemory">刷新</el-button>
</div>
</template>
<!-- 记忆键 -->
<el-form-item label="记忆键">
<el-input
v-model="memoryKey"
placeholder="user_memory_{user_id}"
readonly
/>
<el-tag size="small" style="margin-left: 8px;">
{{ memoryStatus }}
</el-tag>
</el-form-item>
<!-- 对话历史 -->
<el-form-item label="对话历史">
<el-tag
v-if="memoryData?.conversation_history"
type="info"
>
{{ memoryData.conversation_history.length }} 条记录
</el-tag>
<el-button
size="small"
text
@click="showConversationHistory"
>
查看详情
</el-button>
</el-form-item>
<!-- 用户画像 -->
<el-form-item label="用户画像">
<el-tag
v-if="memoryData?.user_profile"
type="success"
>
{{ Object.keys(memoryData.user_profile).length }} 个字段
</el-tag>
<el-button
size="small"
text
@click="showUserProfile"
>
查看详情
</el-button>
</el-form-item>
<!-- TTL 信息 -->
<el-form-item label="过期时间">
<el-tag type="warning">
{{ ttlInfo }}
</el-tag>
</el-form-item>
</el-card>
<!-- 记忆操作 -->
<el-card shadow="never" style="margin-top: 15px;">
<template #header>
<span>🔧 记忆操作</span>
</template>
<el-button-group>
<el-button size="small" @click="testMemoryQuery">测试查询</el-button>
<el-button size="small" @click="clearMemory">清空记忆</el-button>
<el-button size="small" type="danger" @click="deleteMemory">删除记忆</el-button>
</el-button-group>
</el-card>
</el-tab-pane>
```
#### 2.2 功能特性
- **实时记忆查看**:显示当前记忆的实际内容
- **对话历史预览**:显示最近的对话记录
- **用户画像展示**:显示用户画像字段
- **TTL 倒计时**:显示记忆过期时间
- **记忆操作**:提供测试、清空、删除等操作
### 方案 3智能配置助手 ⭐⭐⭐⭐
#### 3.1 配置向导
为复杂节点提供配置向导:
```vue
<el-tab-pane label="配置助手" name="assistant">
<!-- 配置模式选择 -->
<el-card shadow="never">
<template #header>
<span>🎯 快速配置</span>
</template>
<el-radio-group v-model="configMode">
<el-radio label="simple">简单模式</el-radio>
<el-radio label="advanced">高级模式</el-radio>
<el-radio label="template">模板模式</el-radio>
</el-radio-group>
<!-- 简单模式 -->
<div v-if="configMode === 'simple'" class="config-wizard">
<el-steps :active="wizardStep" simple>
<el-step title="选择场景" />
<el-step title="配置参数" />
<el-step title="完成" />
</el-steps>
<!-- 场景选择 -->
<div v-if="wizardStep === 0" class="wizard-content">
<div class="scenario-list">
<div
v-for="scenario in getScenarios(selectedNode.type)"
:key="scenario.id"
class="scenario-item"
@click="selectScenario(scenario)"
>
<el-icon><component :is="scenario.icon" /></el-icon>
<div class="scenario-info">
<div class="scenario-name">{{ scenario.name }}</div>
<div class="scenario-desc">{{ scenario.description }}</div>
</div>
</div>
</div>
</div>
<!-- 参数配置 -->
<div v-if="wizardStep === 1" class="wizard-content">
<el-form :model="wizardConfig" label-width="120px">
<el-form-item
v-for="field in selectedScenario.fields"
:key="field.name"
:label="field.label"
>
<el-input
v-if="field.type === 'text'"
v-model="wizardConfig[field.name]"
:placeholder="field.placeholder"
/>
<el-select
v-else-if="field.type === 'select'"
v-model="wizardConfig[field.name]"
>
<el-option
v-for="opt in field.options"
:key="opt.value"
:label="opt.label"
:value="opt.value"
/>
</el-select>
</el-form-item>
</el-form>
</div>
</div>
<!-- 模板模式 -->
<div v-else-if="configMode === 'template'" class="template-selector">
<el-select
v-model="selectedTemplate"
placeholder="选择配置模板"
@change="applyTemplate"
>
<el-option
v-for="template in getTemplates(selectedNode.type)"
:key="template.id"
:label="template.name"
:value="template.id"
>
<div class="template-option">
<span>{{ template.name }}</span>
<el-tag size="small" type="info">{{ template.category }}</el-tag>
</div>
</el-option>
</el-select>
<el-card v-if="selectedTemplate" shadow="never" style="margin-top: 15px;">
<div class="template-preview">
<div class="preview-title">模板预览</div>
<pre>{{ getTemplatePreview(selectedTemplate) }}</pre>
</div>
</el-card>
</div>
</el-card>
</el-tab-pane>
```
#### 3.2 功能特性
- **场景化配置**:根据使用场景提供预设配置
- **配置向导**:分步骤引导用户完成配置
- **模板库**:提供常用配置模板
- **一键应用**:快速应用模板配置
### 方案 4变量智能提示 ⭐⭐⭐⭐⭐
#### 4.1 增强变量插入功能
```vue
<!-- 在配置字段中添加智能提示 -->
<el-form-item label="提示词">
<el-input
v-model="selectedNode.data.prompt"
type="textarea"
:rows="6"
placeholder="输入提示词..."
/>
<!-- 变量提示面板 -->
<el-collapse v-model="variablePanelActive" style="margin-top: 10px;">
<el-collapse-item title="可用变量" name="variables">
<div class="variable-suggestions">
<!-- 基础变量 -->
<div class="var-group">
<div class="group-title">基础变量</div>
<div class="var-items">
<el-tag
v-for="var in basicVariables"
:key="var"
class="var-tag"
@click="insertVariable('prompt', var)"
>
{{ var }}
</el-tag>
</div>
</div>
<!-- 上游变量 -->
<div class="var-group" v-if="upstreamVariables.length > 0">
<div class="group-title">上游节点变量</div>
<div class="var-items">
<el-tag
v-for="var in upstreamVariables"
:key="var.name"
class="var-tag"
@click="insertVariable('prompt', var.name)"
>
{{ var.name }}
<el-tooltip :content="var.description">
<el-icon><InfoFilled /></el-icon>
</el-tooltip>
</el-tag>
</div>
</div>
<!-- 记忆变量 -->
<div class="var-group" v-if="memoryVariables.length > 0">
<div class="group-title">记忆变量</div>
<div class="var-items">
<el-tag
v-for="var in memoryVariables"
:key="var.name"
class="var-tag"
@click="insertVariable('prompt', var.name)"
>
{{ var.name }}
<el-tooltip :content="var.description">
<el-icon><InfoFilled /></el-icon>
</el-tooltip>
</el-tag>
</div>
</div>
</div>
</el-collapse-item>
</el-collapse>
</el-form-item>
```
#### 4.2 功能特性
- **变量分组**:按来源分组显示变量
- **类型提示**:显示变量的数据类型
- **描述信息**:鼠标悬停显示变量说明
- **一键插入**:点击变量标签直接插入
- **自动补全**:输入 `{{` 时自动提示变量
### 方案 5执行时数据预览 ⭐⭐⭐⭐
#### 5.1 实时数据流追踪
```vue
<el-tab-pane label="数据预览" name="preview">
<!-- 执行记录选择 -->
<el-card shadow="never">
<template #header>
<div class="card-header">
<span>📊 执行数据</span>
<el-select
v-model="selectedExecutionId"
placeholder="选择执行记录"
size="small"
style="width: 200px;"
>
<el-option
v-for="exec in recentExecutions"
:key="exec.id"
:label="`${exec.created_at} - ${exec.status}`"
:value="exec.id"
/>
</el-select>
</div>
</template>
<!-- 输入数据 -->
<el-card shadow="never" style="margin-bottom: 15px;">
<template #header>
<span>📥 输入数据</span>
</template>
<el-scrollbar height="200px">
<pre class="data-viewer">{{ formatInputData(executionData?.input) }}</pre>
</el-scrollbar>
</el-card>
<!-- 输出数据 -->
<el-card shadow="never">
<template #header>
<span>📤 输出数据</span>
</template>
<el-scrollbar height="200px">
<pre class="data-viewer">{{ formatOutputData(executionData?.output) }}</pre>
</el-scrollbar>
</el-card>
<!-- 执行信息 -->
<el-descriptions :column="2" border style="margin-top: 15px;">
<el-descriptions-item label="执行时间">
{{ executionData?.duration }}ms
</el-descriptions-item>
<el-descriptions-item label="执行状态">
<el-tag :type="getStatusType(executionData?.status)">
{{ executionData?.status }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="缓存命中" v-if="executionData?.cache_hit !== undefined">
<el-tag :type="executionData.cache_hit ? 'success' : 'info'">
{{ executionData.cache_hit ? '是' : '否' }}
</el-tag>
</el-descriptions-item>
</el-descriptions>
</el-card>
</el-tab-pane>
```
## 三、实施优先级
### 🔥 高优先级(立即实施)
1. **数据流转可视化面板** ⭐⭐⭐⭐⭐
- 实施难度:中
- 效果:显著提升用户体验
- 预计时间3-4 小时
2. **变量智能提示增强** ⭐⭐⭐⭐⭐
- 实施难度:低
- 效果:降低配置错误率
- 预计时间2-3 小时
### 🟡 中优先级(近期实施)
3. **记忆信息展示** ⭐⭐⭐⭐⭐
- 实施难度:中
- 效果:直观了解记忆状态
- 预计时间2-3 小时
4. **执行时数据预览** ⭐⭐⭐⭐
- 实施难度:中
- 效果:便于调试和优化
- 预计时间2-3 小时
### 🟢 低优先级(长期优化)
5. **智能配置助手** ⭐⭐⭐⭐
- 实施难度:高
- 效果:降低学习成本
- 预计时间4-6 小时
## 四、技术实现要点
### 1. 数据获取
```typescript
// 获取上游节点变量
const getUpstreamVariables = (nodeId: string) => {
const node = nodes.value.find(n => n.id === nodeId)
if (!node) return []
// 根据节点类型推断输出变量
const variables = []
switch (node.type) {
case 'llm':
variables.push({ name: 'output', type: 'string', description: 'LLM生成的回复' })
variables.push({ name: 'response', type: 'string', description: '完整响应' })
break
case 'cache':
variables.push({ name: 'memory', type: 'object', description: '记忆数据' })
variables.push({ name: 'conversation_history', type: 'array', description: '对话历史' })
variables.push({ name: 'user_profile', type: 'object', description: '用户画像' })
break
case 'transform':
// 从mapping中提取
const mapping = node.data?.mapping || {}
Object.keys(mapping).forEach(key => {
variables.push({ name: key, type: 'any', description: `映射字段: ${key}` })
})
break
}
return variables
}
```
### 2. 记忆数据获取
```typescript
// 获取记忆数据
const fetchMemoryData = async (nodeId: string) => {
if (selectedNode.value?.type !== 'cache') return
const key = selectedNode.value.data.key
// 调用API获取记忆数据
try {
const response = await api.get(`/api/v1/cache/${encodeURIComponent(key)}`)
memoryData.value = response.data
} catch (error) {
console.error('获取记忆数据失败:', error)
}
}
```
### 3. 执行数据获取
```typescript
// 获取节点执行数据
const fetchNodeExecutionData = async (nodeId: string, executionId: string) => {
try {
const response = await api.get(
`/api/v1/execution-logs/executions/${executionId}/nodes/${nodeId}`
)
executionData.value = response.data
} catch (error) {
console.error('获取执行数据失败:', error)
}
}
```
## 五、预期效果
### 用户体验提升
1. **降低学习成本**
- 新用户无需查阅文档即可理解数据流转
- 配置错误率降低 50%+
2. **提升开发效率**
- 节点配置时间减少 40%+
- 调试时间减少 60%+
3. **增强可视化**
- 数据流转一目了然
- 记忆状态实时可见
- 执行结果直观展示
### 开发体验提升
1. **快速搭建**
- 通过模板和向导快速创建工作流
- 减少重复配置工作
2. **错误预防**
- 变量类型检查
- 配置验证提示
- 常见错误预警
## 六、总结
您的想法完全正确!这些增强功能将显著提升用户体验和开发效率。建议优先实施:
1. **数据流转可视化面板** - 让用户清楚看到数据如何流转
2. **变量智能提示** - 降低配置错误率
3. **记忆信息展示** - 直观了解记忆状态
这些功能将使平台更加易用和专业!
---
**文档版本**v1.0
**创建时间**2024年
**维护人员**AI Assistant