实现记忆开关

本次功能

记忆开关

支持:

  • 每个会话单独开启 / 关闭记忆注入
  • 关闭后仍保留记忆数据,但不会参与回答
  • 方便对比"有记忆"和"无记忆"的回复差异

1)改 web/src/utils/session.js

createSession 里新增字段

yaml 复制代码
  return {
    id: crypto.randomUUID(),
    title,
    mode,
    customPrompt: persona.systemPrompt,
    temperature: 0.7,
    topP: 1,
    maxTokens: 1200,
    memoryEnabled: true,
    pinned: false,

loadSessions 里的 normalize 增加默认值

yaml 复制代码
      return {
        mode,
        customPrompt:
          item.customPrompt ||
          item.messages?.find(m => m.role === 'system')?.content ||
          persona.systemPrompt,
        temperature: 0.7,
        topP: 1,
        maxTokens: 1200,
        memoryEnabled: true,
        pinned: false,
        ...item,
      }

2)改 server/app.py

ChatRequest 新增字段

python 复制代码
class ChatRequest(BaseModel):
    messages: List[Message]
    session_id: Optional[str] = None
    temperature: Optional[float] = 0.7
    top_p: Optional[float] = 1
    max_tokens: Optional[int] = 1200
    memory_enabled: Optional[bool] = True

build_final_messages 改成支持记忆开关

python 复制代码
def build_final_messages(messages: List[dict], session_id: str = "", memory_enabled: bool = True):
    session_memories = get_session_memories(session_id or "") if memory_enabled else []
    memory_prompt = build_memory_prompt(session_memories) if memory_enabled else ""

    final_messages = []
    for item in messages:
        if item["role"] == "system":
            final_messages.append({
                "role": "system",
                "content": f'{item["content"]}\n\n{memory_prompt}'.strip()
            })
        else:
            final_messages.append(item)

    return final_messages, session_memories

/api/chat 里调用改一下

python 复制代码
    final_messages, session_memories = build_final_messages(
        messages,
        req.session_id or "",
        req.memory_enabled if req.memory_enabled is not None else True,
    )

/api/chat/stream 里调用也改一下

python 复制代码
    final_messages, session_memories = build_final_messages(
        messages,
        req.session_id or "",
        req.memory_enabled if req.memory_enabled is not None else True,
    )

3)改 web/src/App.vue

新增计算属性

javascript 复制代码
const currentMemoryEnabled = computed(() => {
  return currentSession.value?.memoryEnabled ?? true
})

新增状态

csharp 复制代码
const memoryEnabledDraft = ref(true)

增加监听

ini 复制代码
watch(
  currentMemoryEnabled,
  newVal => {
    memoryEnabledDraft.value = !!newVal
  },
  { immediate: true }
)

新增保存方法

ini 复制代码
const handleSaveMemorySetting = () => {
  if (!currentSession.value) return

  sessions.value = sortSessions(
    sessions.value.map(item =>
      item.id === currentSessionId.value
        ? {
            ...item,
            memoryEnabled: !!memoryEnabledDraft.value,
            updatedAt: Date.now(),
          }
        : item
    )
  )
}

流式请求 body 增加字段

yaml 复制代码
    body: JSON.stringify({
      messages,
      session_id: currentSession.value.id,
      temperature: currentSession.value.temperature,
      top_p: currentSession.value.topP,
      max_tokens: currentSession.value.maxTokens,
      memory_enabled: currentSession.value.memoryEnabled,
    }),

4)改模板

在参数面板里追加记忆开关块

xml 复制代码
<div class="param-item">
  <label class="param-label">memory</label>

  <div class="memory-switch-row">
    <label class="memory-switch-label">
      <input v-model="memoryEnabledDraft" type="checkbox" />
      <span>{{ memoryEnabledDraft ? '开启记忆注入' : '关闭记忆注入' }}</span>
    </label>

    <button class="prompt-btn small" @click="handleSaveMemorySetting">保存记忆设置</button>
  </div>

  <div class="param-tip">关闭后会保留记忆数据,但不会注入到对话上下文</div>
</div>

5)补充样式

css 复制代码
.memory-switch-row {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 10px;
}

.memory-switch-label {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 14px;
  color: #111827;
}

.prompt-btn.small {
  padding: 6px 10px;
  font-size: 12px;
}

6)怎么验证

nice !

本次 提交修改 代码

github.com/fhj414/ai-c...

完整代码请看仓库,仓库地址:github.com/huanhunmao/... star 🌟🌟🌟 谢谢~

相关推荐
IT_陈寒10 分钟前
Redis缓存击穿把我整不会了,原来还有这手操作
前端·人工智能·后端
idcu32 分钟前
深入 Lyt.js 组件系统:L2 渲染引擎层的核心
前端·typescript
kyriewen1 小时前
面试官让我查各部门工资最高的员工,我用AI三秒写出窗口函数,他愣了
后端·mysql·面试
这是程序猿1 小时前
Spring Boot自动配置详解
java·大数据·前端
文心快码BaiduComate1 小时前
干货|Comate Harness Engineering工程实践指南
前端·后端·程序员
还有多久拿退休金1 小时前
一张栈的图,治好你面试答不出 script 阻塞的病
前端·javascript
光辉GuangHui1 小时前
Agent Skill 也需要测试:如何搭建 Skill 评估框架
前端·后端·llm
To_OC1 小时前
我终于搞懂 Claude Code 核心逻辑!90%的人都用错了模式
前端·ai编程
我是谁的程序员1 小时前
Mac 上生成 AppStoreInfo.plist 文件,App Store 上架
后端·ios
蓝宝石的傻话1 小时前
Headless浏览器的隐形陷阱:为什么你的AI自动化工具抓不到页面早期错误?
前端