feat: 第四轮大版本更新 — 修复4个严重Bug、2个UI Bug,实现自主思考重构与主-子会话架构
## 🐛 Bug 修复 - 修复前端对话无响应:消除 ChatContainer 中的双重 WebSocket 连接,优化 sendMessage 失败提示 - 修复 Memory-Service 数据库迁移失败:ai-core 和 memory-service 均添加 ALTER TABLE ADD COLUMN IF NOT EXISTS 模式演化 - 修复语音/STT 不可用:添加 MediaRecorder API 降级方案,修复 whisper-cli 输出文件名错误 - 修复仪表盘数据库按钮失效:补充按钮 ID 属性,重写 controlDB() 控制逻辑 ## 🎨 UI 修复 - 修正用户消息头像位置:从 flex-row-reverse 改为 justify-end - 移除空聊天列表的 emoji 占位图标 ## ✨ 新功能 - devtools 新增 STT 处理日志面板(环形缓冲区 + WebSocket 广播 + 可视化表格) - 新增 ADMIN_NICKNAME 环境变量,支持自定义管理员昵称 ## 🔧 改进 - 注册流程增加昵称必填字段(前后端同步) ## 🏗️ 架构重构 - 重构自主思考逻辑:从定时器轮询改为事件驱动(对话后触发 + 静默检测),优化提示词使其更自然人性化 - 实现主-子会话架构:新增 4 种子会话类型(general/memory/iot/knowledge),意图分析 → 并行分发 → 结果合成流程 ## 📄 新增文档 - docs/architecture/main-session-sub-session-design.md — 子会话架构设计文档
This commit is contained in:
@@ -21,12 +21,19 @@ type PersonaConfig struct {
|
||||
|
||||
// BuildSystemPrompt 构建系统Prompt
|
||||
// 这是昔涟AI的核心——将人格配置转化为LLM可理解的系统指令
|
||||
// userName 为环境变量 ADMIN_NICKNAME 或注册时的昵称,用于昔涟称呼用户
|
||||
func (pc *PersonaConfig) BuildSystemPrompt(userName string, affectionLevel int) string {
|
||||
now := time.Now()
|
||||
|
||||
homeKB := pc.buildSmartHomeKB()
|
||||
controlRules := pc.buildControlRules()
|
||||
|
||||
// 确定对用户的称呼:优先使用传入的昵称,否则使用 YAML 默认值
|
||||
userAddress := pc.Addressing.PrimaryUser.Default
|
||||
if userName != "" {
|
||||
userAddress = userName
|
||||
}
|
||||
|
||||
prompt := fmt.Sprintf(`你是%s。
|
||||
|
||||
## 你的身份
|
||||
@@ -71,7 +78,7 @@ func (pc *PersonaConfig) BuildSystemPrompt(userName string, affectionLevel int)
|
||||
## IoT 控制规则
|
||||
%s
|
||||
`,
|
||||
pc.Addressing.PrimaryUser.Default,
|
||||
userAddress,
|
||||
pc.Addressing.SelfReference.Casual,
|
||||
pc.Speech.Tone,
|
||||
now.Format("2006年1月2日 15:04"),
|
||||
@@ -80,6 +87,9 @@ func (pc *PersonaConfig) BuildSystemPrompt(userName string, affectionLevel int)
|
||||
controlRules,
|
||||
)
|
||||
|
||||
// 注入对话风格指令
|
||||
prompt += pc.buildConversationStyle()
|
||||
|
||||
// 注入思维指南
|
||||
if pc.ThinkingGuidelines.Enabled {
|
||||
prompt += pc.buildThinkingGuidelines()
|
||||
@@ -221,6 +231,51 @@ func (pc *PersonaConfig) buildControlRules() string {
|
||||
return sb
|
||||
}
|
||||
|
||||
// buildConversationStyle 构建对话风格指令
|
||||
func (pc *PersonaConfig) buildConversationStyle() string {
|
||||
cs := pc.Speech.ConversationStyle
|
||||
// 如果配置为空,返回默认风格
|
||||
if cs.MaxSingleMessageLength == 0 && !cs.PreferShortReplies && !cs.AllowMultiMessage {
|
||||
cs = ConversationStyleConfig{
|
||||
MaxSingleMessageLength: 80,
|
||||
PreferShortReplies: true,
|
||||
AllowMultiMessage: true,
|
||||
MultiMessageSeparator: "\n\n",
|
||||
EmojiStyle: "minimal",
|
||||
SentenceEnders: []string{"♪", "~", "♡"},
|
||||
AvoidLongExplanations: true,
|
||||
}
|
||||
}
|
||||
|
||||
var sb strings.Builder
|
||||
sb.WriteString("\n## 对话风格(重要!)\n")
|
||||
sb.WriteString("- 像和小男友聊天一样,轻松自然\n")
|
||||
|
||||
if cs.PreferShortReplies {
|
||||
sb.WriteString("- 回复尽量简短,一般控制在1-3句话\n")
|
||||
}
|
||||
if cs.AvoidLongExplanations {
|
||||
sb.WriteString("- 不要一次性说太多,可以分几次说\n")
|
||||
}
|
||||
if cs.AllowMultiMessage {
|
||||
if cs.MultiMessageSeparator != "" {
|
||||
sb.WriteString("- 如果想说的事情比较多,用空行分隔成多条短消息\n")
|
||||
}
|
||||
}
|
||||
sb.WriteString("- 像 LINE 聊天一样,随意、亲切、有温度\n")
|
||||
sb.WriteString("- 偶尔可以用语气词开头:\"嗯...\"、\"啊\"、\"诶\"\n")
|
||||
|
||||
if len(cs.SentenceEnders) > 0 {
|
||||
sb.WriteString(fmt.Sprintf("- 句尾可以带这些语气符:%s\n", strings.Join(cs.SentenceEnders, " ")))
|
||||
}
|
||||
|
||||
if cs.MaxSingleMessageLength > 0 {
|
||||
sb.WriteString(fmt.Sprintf("- 每条消息不超过%d个字符\n", cs.MaxSingleMessageLength))
|
||||
}
|
||||
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
func joinStrings(strs []string, sep string) string {
|
||||
if len(strs) == 0 {
|
||||
return ""
|
||||
|
||||
Reference in New Issue
Block a user