## 功能概述 - 用户可创建、编辑、删除自定义情景 - 支持自定义情景名称、图标、描述、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
47 lines
1.3 KiB
Go
47 lines
1.3 KiB
Go
package eino
|
||
|
||
import (
|
||
"context"
|
||
"strings"
|
||
"sync"
|
||
)
|
||
|
||
// PipelineState Graph 全局状态,用于跨节点收集数据。
|
||
// 通过 compose.WithGenLocalState 注册,各节点通过 compose.ProcessState 读写。
|
||
type PipelineState struct {
|
||
mu sync.Mutex
|
||
FullResponse strings.Builder // LLM 完整回复(由 Callback 累积)
|
||
TranscribedText string // STT 识别文本
|
||
Model string // 实际使用的模型名
|
||
TokenUsage *TokenUsage // token 用量
|
||
|
||
// 从 PipelineInput 复制的元数据,供下游节点(History、Done)读取
|
||
SessionID string
|
||
RequestID string
|
||
ImageData []byte
|
||
Scenario string
|
||
DetailLevel string
|
||
Language string
|
||
TTSEnabled bool
|
||
UserID string // 新增:用户 ID,用于加载自建情景
|
||
}
|
||
|
||
// genLocalState 创建每请求的 PipelineState 实例。
|
||
func genLocalState(ctx context.Context) *PipelineState {
|
||
return &PipelineState{}
|
||
}
|
||
|
||
// AppendText 追加文本到 FullResponse(线程安全)。
|
||
func (s *PipelineState) AppendText(text string) {
|
||
s.mu.Lock()
|
||
defer s.mu.Unlock()
|
||
s.FullResponse.WriteString(text)
|
||
}
|
||
|
||
// GetFullResponse 获取完整回复文本(线程安全)。
|
||
func (s *PipelineState) GetFullResponse() string {
|
||
s.mu.Lock()
|
||
defer s.mu.Unlock()
|
||
return s.FullResponse.String()
|
||
}
|