feat: 实现自建情景功能

## 功能概述
- 用户可创建、编辑、删除自定义情景
- 支持自定义情景名称、图标、描述、Prompt、首句引导
- 完整的权限隔离,用户只能管理自己的情景
- 深度集成 Eino 框架,动态加载自建情景 Prompt

## 后端实现
### 数据库
- 新增 user_scenarios 表
- 支持用户配额(最多 20 个)
- 字段验证:description 可选,prompt 最小 10 字符

### API
- GET /api/scenarios - 获取用户情景列表
- POST /api/scenarios - 创建情景
- GET /api/scenarios/:id - 获取详情
- PATCH /api/scenarios/:id - 更新情景
- DELETE /api/scenarios/:id - 删除情景

### Eino 集成
- PipelineState 添加 UserID 字段
- nodes_history 动态加载用户自建情景
- GetScenarioPrompt 支持自建情景优先级

## 前端实现
### 组件
- CreateScenarioModal - 创建情景对话框
- EditScenarioModal - 编辑情景对话框
- ConfigPanel 改造 - 分组显示系统预置和自建情景

### Hook
- useScenarios - 合并系统和自建情景,提供 CRUD 接口

### 国际化
- 中文、英文、日文翻译支持

## 问题修复
- 修复 CORS 问题:使用 Vite 代理
- 统一验证规则:description 可选,prompt 最小 10 字符
- 修复数据库约束:使用 NULLIF 处理空字符串

## 文件变更
新增文件: 13 个
修改文件: 14 个

详见文档: docs/自建情景功能完整文档.md
This commit is contained in:
2026-06-21 15:38:28 +08:00
parent 9ad486d117
commit 1079e22699
24 changed files with 2779 additions and 62 deletions

View File

@@ -178,4 +178,41 @@ export const zhCN: TranslationMap = {
// Account (in settings)
"settings.account": "账号",
"settings.account.user": "当前用户",
// Custom scenarios
"settings.scenario.system": "系统预置情景",
"settings.scenario.custom": "我的情景",
"settings.scenario.empty": "还没有自建情景,点击上方按钮创建",
"scenario.create.button": "创建新情景",
"scenario.create.title": "创建自建情景",
"scenario.edit.title": "编辑情景",
"scenario.create.name": "情景名称",
"scenario.create.namePlaceholder": "例如:创意写作导师",
"scenario.create.icon": "图标",
"scenario.create.description": "简短描述",
"scenario.create.descriptionPlaceholder": "一句话介绍这个情景的作用",
"scenario.create.prompt": "System Prompt",
"scenario.create.promptPlaceholder": "定义 AI 的角色和交互规则...",
"scenario.create.promptGuide": "查看编写指南",
"scenario.create.promptGuide.tips": "编写提示:",
"scenario.create.promptGuide.tip1": "明确角色定位:你是谁,不是谁",
"scenario.create.promptGuide.tip2": "列出交互规则:如何回答,每次几句话",
"scenario.create.promptGuide.tip3": "添加约束条件:不要做什么",
"scenario.create.promptGuide.example": "示例:",
"scenario.create.greeting": "首句引导(可选)",
"scenario.create.greetingPlaceholder": "切换到此情景时AI 的第一句话...",
"scenario.create.language": "默认语言",
"scenario.error.nameLength": "情景名称需要 2-50 个字符",
"scenario.error.promptLength": "Prompt 需要 10-2000 个字符",
"scenario.error.greetingLength": "首句引导不超过 500 个字符",
// Common actions
"common.cancel": "取消",
"common.create": "创建",
"common.creating": "创建中...",
"common.save": "保存",
"common.saving": "保存中...",
"common.edit": "编辑",
"common.delete": "删除",
"common.confirmDelete": "再次点击确认删除",
};